Click here to Skip to main content
Licence 
First Posted 24 Jun 2002
Views 174,542
Bookmarked 51 times

Adding icons to menus in VB.NET

By | 24 Jun 2002 | Article
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 most easier than VB 6 or other languages.

'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

About the Author

Retana Padilla



United States United States

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Generalfeedback Pinmemberdeostroll19:17 24 Dec '06  
QuestionHow to create Skin From My Graphic design? PinmemberKhanh CaCa14:55 13 Dec '06  
QuestionFixing the Menu Width!!! Pinmemberajalilqarshi18:38 15 Mar '06  
AnswerRe: Fixing the Menu Width!!! PinmemberBrezza0:32 28 Dec '06  
GeneralOut of Memory PinmemberNauman_Unique20:25 16 Feb '05  
GeneralRe: Out of Memory PinmemberTanveerBhai0:55 27 Jan '06  
GeneralIcon Size PinmemberEcoSys13:21 25 Oct '04  
GeneralWorks great for me except on little problem PinsussFlemster6:19 12 Aug '03  
GeneralRe: Works great for me except on little problem PinmemberBrezza0:39 28 Dec '06  
Generalout of memory PinsussAnonymous13:29 29 May '03  
GeneralRe: out of memory PinsussLieiu19:41 9 Jul '04  
GeneralDoesn't work on context menu PinsussAnonymous14:45 28 Apr '03  
QuestionAdd a text box? Pinsusscotaej8:00 8 Apr '03  
AnswerRe: Add a text box? Pinmemberharmony_harmony19:48 9 Sep '04  
GeneralTypedescriptor in Funtion GetRealText PinmemberMatthias Verstraeten8:08 2 Apr '03  
GeneralOpenGL in VB.NET PinmemberGarth W8:45 13 Feb '03  
GeneralRe: OpenGL in VB.NET PinsussClarissa Rossi23:45 18 Aug '03  
QuestionBug? PinmemberBalder197819:57 21 Jan '03  
GeneralIntercept chr(13) key in cell datagrid Pinmemberintibnin22:04 26 Nov '02  
GeneralNot working for me!!! Pinmemberemoreau16:44 16 Sep '02  
GeneralRe: Not working for me!!! Pinmemberemoreau14:31 17 Sep '02  
GeneralRe: Not working for me!!! PinmemberRurro5:32 11 Feb '03  
GeneralRe: Not working for me!!! Pinmemberjakfutaz1:12 1 Apr '03  
GeneralRe: Not working for me!!! Pinmembercmpnrd14114:59 12 Jul '07  

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

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120517.1 | Last Updated 25 Jun 2002
Article Copyright 2002 by Retana Padilla
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid