Click here to Skip to main content
15,860,972 members
Articles / Programming Languages / XML

Adding Icons to Menus in VB.NET

Rate me:
Please Sign up or sign in to vote.
4.56/5 (15 votes)
24 Jun 2002 209.2K   563   52   24
A simple extension of the menu control that displays icons

IconsMenu

Introduction

This project adds icons in menus in VB.NET. You can use the module 'IconsMenuMain.vb' as the base of your project for adding icons. This is easier than VB 6 or other languages.

VB
'IconsMenuMain.vb
'Module for adding icons to menus...

Imports System
Imports System.ComponentModel
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Text
Imports System.Windows.Forms


Module IconsMenuMain

    Dim m_Font As New Font("Arial", 8)

    Sub MeasureItems(ByVal EvMeasureItem As _
           System.Windows.Forms.MeasureItemEventArgs, _
           ByVal Mi As MenuItem)
        Dim sf As StringFormat = New StringFormat()
        sf.HotkeyPrefix = HotkeyPrefix.Show
        sf.SetTabStops(60, New Single() {0})
        EvMeasureItem.ItemHeight = 22
        EvMeasureItem.ItemWidth = _
          CInt(EvMeasureItem.Graphics.MeasureString(GetRealText(Mi), _
          m_Font, 10000, sf).Width) + 10
        sf.Dispose()
        sf = Nothing
    End Sub

    Sub DrawItems(ByVal EvDrawItems As _
          System.Windows.Forms.DrawItemEventArgs, _
          ByVal Mi As MenuItem, ByVal m_Icon As Icon)
        Dim br As Brush
        Dim fDisposeBrush As Boolean
        If Not m_Icon Is Nothing Then
            If Not Mi.Checked Then
                EvDrawItems.Graphics.DrawIcon(m_Icon, _
                   EvDrawItems.Bounds.Left + 2, _
                   EvDrawItems.Bounds.Top + 2)
            Else
                EvDrawItems.Graphics.DrawIcon(m_Icon, _
                   EvDrawItems.Bounds.Left + 2, _
                   EvDrawItems.Bounds.Top + 2)
                Dim nPen As System.Drawing.Pen
                If Not Mi.Enabled Then
                    NPEN = New Pen(Color.DarkGray)
                Else
                    nPen = New Pen(Color.Gray)
                End If
                EvDrawItems.Graphics.DrawRectangle(nPen, _
                  1, EvDrawItems.Bounds.Top, 20, 20)
                EvDrawItems.Graphics.DrawRectangle(nPen, _
                  3, EvDrawItems.Bounds.Top + 2, 16, 16)
            End If
        Else
            If Mi.Checked Then
                Dim nPen As System.Drawing.Pen
                If Not Mi.Enabled Then
                    NPEN = New Pen(Color.DarkGray)
                Else
                    nPen = New Pen(Color.Gray)
                End If
                EvDrawItems.Graphics.DrawRectangle(nPen, _
                  1, EvDrawItems.Bounds.Top, 20, 20)
                Dim Pnts() As Point
                ReDim Pnts(2)
                Pnts(0) = New Point(15, EvDrawItems.Bounds.Top + 6)
                Pnts(1) = New Point(8, EvDrawItems.Bounds.Top + 13)
                Pnts(2) = New Point(5, EvDrawItems.Bounds.Top + 10)
                If Mi.Enabled Then
                    EvDrawItems.Graphics.DrawLines(New _
                      Pen(Color.Black), Pnts)
                Else
                    EvDrawItems.Graphics.DrawLines(New _
                      Pen(Color.Gray), Pnts)
                End If
            End If
        End If
        Dim rcBk As Rectangle = EvDrawItems.Bounds
        rcBk.X += 24

        If CBool(EvDrawItems.State And _
                 DrawItemState.Selected) Then
            br = New LinearGradientBrush(rcBk, _
              Color.MidnightBlue, Color.LightBlue, 0)
            fDisposeBrush = True
        Else
            br = SystemBrushes.Control
        End If

        EvDrawItems.Graphics.FillRectangle(br, rcBk)
        If fDisposeBrush Then br.Dispose()
        br = Nothing

        Dim sf As StringFormat = New StringFormat()
        sf.HotkeyPrefix = HotkeyPrefix.Show
        sf.SetTabStops(60, New Single() {0})
        If Mi.Enabled Then
            br = New SolidBrush(EvDrawItems.ForeColor)
        Else
            br = New SolidBrush(Color.Gray)
        End If

        EvDrawItems.Graphics.DrawString(GetRealText(Mi), _
                 m_Font, br, EvDrawItems.Bounds.Left + 25, _
                 EvDrawItems.Bounds.Top + 2, sf)
        br.Dispose()
        br = Nothing
        sf.Dispose()
        sf = Nothing
    End Sub

    Function GetRealText(ByVal Mi As MenuItem) As String
        Dim s As String = Mi.Text
        If Mi.ShowShortcut And Mi.Shortcut <> Shortcut.None Then
            Dim k As Keys = CType(Mi.Shortcut, Keys)
            s = s & Convert.ToChar(9) & _
             TypeDescriptor.GetConverter(GetType(Keys)).ConvertToString(k)
        End If
        Return s
    End Function

End Module


'**************
'In the items of menu which you want 
'add icon modify the property OwnerDraw to TRUE
'For use this code only add the next references in the form...

    Private Sub MenuItem3_DrawItem(ByVal sender As Object, _
            ByVal e As System.Windows.Forms.DrawItemEventArgs) _
            Handles MenuItem3.DrawItem

        Dim Ic As New Icon("C:\Documents" & _
          " and Settings\Yo\Escritorio\iconmenu\Save.ico")
        DrawItems(e, MenuItem3, Nothing)
    End Sub

    Private Sub MenuItem3_MeasureItem(ByVal sender As Object, _
            ByVal e As System.Windows.Forms.MeasureItemEventArgs) _
            Handles MenuItem3.MeasureItem

        MeasureItems(e, MenuItem3)
    End Sub

This is also an easy write in VC#.NET.

License

This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.

A list of licenses authors might use can be found here.


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Generalfeedback Pin
deostroll24-Dec-06 19:17
deostroll24-Dec-06 19:17 
QuestionHow to create Skin From My Graphic design? Pin
Khanh CaCa13-Dec-06 14:55
Khanh CaCa13-Dec-06 14:55 
QuestionFixing the Menu Width!!! Pin
ajalilqarshi15-Mar-06 18:38
ajalilqarshi15-Mar-06 18:38 
AnswerRe: Fixing the Menu Width!!! Pin
Brezza28-Dec-06 0:32
Brezza28-Dec-06 0:32 
GeneralOut of Memory Pin
nnahmed0316-Feb-05 20:25
nnahmed0316-Feb-05 20:25 
GeneralRe: Out of Memory Pin
TanveerBhai27-Jan-06 0:55
TanveerBhai27-Jan-06 0:55 
GeneralIcon Size Pin
EcoSys25-Oct-04 13:21
EcoSys25-Oct-04 13:21 
GeneralWorks great for me except on little problem Pin
Flemster12-Aug-03 6:19
Flemster12-Aug-03 6:19 
GeneralRe: Works great for me except on little problem Pin
Brezza28-Dec-06 0:39
Brezza28-Dec-06 0:39 
Generalout of memory Pin
Anonymous29-May-03 13:29
Anonymous29-May-03 13:29 
GeneralRe: out of memory Pin
Lieiu9-Jul-04 19:41
sussLieiu9-Jul-04 19:41 
GeneralDoesn't work on context menu Pin
Anonymous28-Apr-03 14:45
Anonymous28-Apr-03 14:45 
QuestionAdd a text box? Pin
cotaej8-Apr-03 8:00
cotaej8-Apr-03 8:00 
AnswerRe: Add a text box? Pin
harmony_harmony9-Sep-04 19:48
harmony_harmony9-Sep-04 19:48 
GeneralTypedescriptor in Funtion GetRealText Pin
Matthias Verstraeten2-Apr-03 8:08
Matthias Verstraeten2-Apr-03 8:08 
GeneralOpenGL in VB.NET Pin
Garth W13-Feb-03 8:45
Garth W13-Feb-03 8:45 
GeneralRe: OpenGL in VB.NET Pin
Clarissa Rossi18-Aug-03 23:45
sussClarissa Rossi18-Aug-03 23:45 
QuestionBug? Pin
Balder197821-Jan-03 19:57
Balder197821-Jan-03 19:57 
GeneralIntercept chr(13) key in cell datagrid Pin
intibnin26-Nov-02 22:04
intibnin26-Nov-02 22:04 
GeneralNot working for me!!! Pin
Eric Moreau16-Sep-02 16:44
Eric Moreau16-Sep-02 16:44 
GeneralRe: Not working for me!!! Pin
Eric Moreau17-Sep-02 14:31
Eric Moreau17-Sep-02 14:31 
GeneralRe: Not working for me!!! Pin
Rurro11-Feb-03 5:32
Rurro11-Feb-03 5:32 
GeneralRe: Not working for me!!! Pin
jakfutaz1-Apr-03 1:12
jakfutaz1-Apr-03 1:12 
GeneralRe: Not working for me!!! Pin
cmpnrd141112-Jul-07 4:59
cmpnrd141112-Jul-07 4:59 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.