' This class does the owner drawing of a MenuItem to draw a color box.' The class inherits from MenuItem, thus the ColorMenuItem objects' can be added to a parent MenuItem or a context menu as you ' normally do, and can also be mixed with other MenuItem items ' under the same parent item.Imports System.DrawingImports System.Windows.FormsPublic Class ColorMenuItem : Inherits MenuItem Public m_Color As Color Sub New(ByVal color As Color) ' create the base menu MyBase.New("") ' save the color, and specify that the item will be owner drawn Me.OwnerDraw = True m_Color = color End Sub Sub New(ByVal color As Color, ByVal eventHandler As EventHandler) ' create the base menu MyBase.New("", eventHandler) ' save the color, and specify that the item will be owner drawn Me.OwnerDraw = True m_Color = color End Sub Public Property Color() As Color Get Return m_Color End Get Set(ByVal Value As Color) m_Color = Value End Set End Property Protected Overrides Sub OnMeasureItem(ByVal e As MeasureItemEventArgs) MyBase.OnMeasureItem(e) e.ItemHeight = SystemInformation.MenuHeight - 4 e.ItemWidth = 40 End Sub Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs) MyBase.OnDrawItem(e) ' draw the background, using the normal/selected color ' according to the menu item state Dim brBack As Brush If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then brBack = SystemBrushes.Highlight Else brBack = SystemBrushes.Menu End If e.Graphics.FillRectangle(brBack, e.Bounds) ' draw the color box Dim brColorBox As Brush = New SolidBrush(m_Color) Dim rect As New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, _ e.Bounds.Height) ' draw the box's black border rect.Inflate(-5, -3) e.Graphics.FillRectangle(brColorBox, rect) e.Graphics.DrawRectangle(New Pen(Color.Black), New Rectangle(rect.X, _ rect.Y, rect.Width, rect.Height)) End SubEnd Class' SAMPLE USAGE: create a color picker' In this example we create a menu bar for the form, with a top level ' menu called "Colors", and add to this item some ColorMenuItem items ' to simulate a color picker menu. We also handle the click on the' color items, and change the form's background color accordingly.' You may change the code to add the color items to a context menu, ' associated to a toolbar button or any other control.Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' create a new menu bar and add it to the form Me.Menu = New MainMenu() ' create and add the Colors top menu item Dim mnuColors As MenuItem = New MenuItem("Colors") Me.Menu.MenuItems.Add(mnuColors) ' add some color menu items mnuColors.MenuItems.Add(New ColorMenuItem(Color.Green, _ New EventHandler(AddressOf mnuColor_Click))) mnuColors.MenuItems.Add(New ColorMenuItem(Color.Navy, _ New EventHandler(AddressOf mnuColor_Click))) mnuColors.MenuItems.Add(New ColorMenuItem(Color.Purple, _ New EventHandler(AddressOf mnuColor_Click))) mnuColors.MenuItems.Add(New ColorMenuItem(Color.Red, _ New EventHandler(AddressOf mnuColor_Click))) mnuColors.MenuItems.Add(New ColorMenuItem(Color.Lime, _ New EventHandler(AddressOf mnuColor_Click))) mnuColors.MenuItems.Add(New ColorMenuItem(Color.Yellow, _ New EventHandler(AddressOf mnuColor_Click))) ' create a normal menu item mnuColors.MenuItems.Add(New MenuItem("Other color...", _ New EventHandler(AddressOf mnuColor_Click)))End SubPrivate Sub mnuColor_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Dim bgColor As Color ' if the clicked item is a ColorMenuItem, extract its color If TypeOf sender Is ColorMenuItem Then bgColor = CType(sender, ColorMenuItem).Color Else ' otherwise open a Windows's Color dialog box ' ...add your code here... End If ' set the form's background color to the selected text Me.BackColor = bgColorEnd Sub