There are a lot more drawing features included in .NET, but what we've seen here should be enough to whet your appetite. You can do a lot of fancy drawing with GDI+, but let's face it: You and I are programmers, not artists. If we were artists, we'd be raking in six figures using a floor mop to draw traditional abstract cubist Italian landscapes with Bauhausian accents.
Fortunately, there are practical semi-artistic things you can do with GDI+. One important drawing feature is owner draw, a sharing of drawing responsibilities between a control and you, the programmer. (You are the "owner.") The ComboBox control supports owner drawing of the individual items in the drop-down portion of the list. Let's create a ComboBox control that displays color names, including a small sample of the color to the left of the name. Create a new Windows Forms application, and add a ComboBox control named ComboBox1 to Form1. Make these changes to ComboBox1.
Now, add the following code to the source code area of Form1's class.
Private Sub ComboBox1_DrawItem(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DrawItemEventArgs) _ Handles ComboBox1.DrawItem ' ----- Ignore the unselelected state. If (e.Index = -1) Then Return ' ----- Create a brush for the display color, based on ' the name of the item. Dim colorBrush As New SolidBrush(Color.FromName( _ CStr(ComboBox1.Items(e.Index)))) ' ----- Create a text brush. The color varies based on ' whether this item is selected or not. Dim textBrush As Brush If ((e.State And DrawItemState.Selected) = _ DrawItemState.Selected) Or _ ((e.State And DrawItemState.HotLight) = _ DrawItemState.HotLight) Then textBrush = New SolidBrush(SystemColors.HighlightText) Else textBrush = New SolidBrush(SystemColors.ControlText) End If ' ----- Get the shape of the color display area. Dim colorBox As New Rectangle(e.Bounds.Left + 4, _ e.Bounds.Top + 2, (e.Bounds.Height - 4) * 2, _ e.Bounds.Height - 4) ' ----- Draw the selected or unselected background. e.DrawBackground() ' ----- Draw the custom color area. e.Graphics.FillRectangle(colorBrush, colorBox) e.Graphics.DrawRectangle(Pens.Black, colorBox) ' ----- Draw the name of the color to the right of ' the color. e.Graphics.DrawString(CStr(ComboBox1.Items(e.Index)), _ ComboBox1.Font, textBrush, 8 + colorBox.Width, _ e.Bounds.Top + ((e.Bounds.Height - _ ComboBox1.Font.Height) / 2)) ' ----- Draw a selected rectangle around the item, ' if needed. e.DrawFocusRectangle() ' ----- Clean up. textBrush.Dispose() colorBrush.Dispose() End Sub
Run the code and play with the combo box, as shown in Figure 17-14.
Figure 17-14. Our custom color combo box