Click here to Skip to main content
Licence CPOL
First Posted 17 Aug 2005
Views 132,092
Bookmarked 74 times

Flat ComboBox with MS Office XP/2003 style support

By | 1 Dec 2005 | Article
An article on creating a flat combobox using VB.NET.
Prize winner in Competition "VB.NET Jul 2005"

Introduction

First of all, on the Internet, a lot of examples of flat combo boxes can be found. I tried to make a very simple one with a lot of functionality. On the screenshot above, you can see the functions that I have integrated: support for big fonts (the arrow will be centered), RTL (right to left) support, support for two dropdown styles (simple is not supported yet), and of course the two styles.

The different states

 
Office XP
Office 2003
normal

focused

disabled

dropeddown

'Enum with all the possible states
Enum states
    normal
    focused
    dropeddown
    disabled
End Enum
'Variable to save the current state
Dim state As states = states.normal
    
Function UpdateState()
    'save the current state
    Dim temp As states = state
    '
    If Me.Enabled Then
        If Me.DroppedDown Then
            Me.state = states.dropeddown
        Else
            If ClientRectangle.Contains(_
                    PointToClient(Me.MousePosition)) Then
                Me.state = states.focused
            ElseIf Me.Focused Then
                Me.state = states.focused
            Else
                Me.state = states.normal
            End If
        End If
    Else
        Me.state = states.disabled
    End If
    'only redraw if the state has changed
    If state <> temp Then
        Me.Invalidate()
    End If
End Function

Using the code

FlatComboBox is a UserControl based on Windows.Forms.ComboBox:

Imports System.Drawing.Drawing2D

Public Class FlatComboBox
    Inherits System.Windows.Forms.ComboBox

    '...

End Class

Reacting on events (mousemove etc.) is done by overriding WndProc:

Protected Overrides Sub WndProc(ByRef m As _
                       System.Windows.Forms.Message)
        MyBase.WndProc(m)
        Select Case m.Msg

            Case &HF
                'WM_PAINT

                '"simple" is not currently supported
                If Me.DropDownStyle = _
                           ComboBoxStyle.Simple Then Exit Sub

                '==========START DRAWING===========
                g = Me.CreateGraphics
                'clear everything
                If Me.Enabled Then
                    g.Clear(Color.White)
                Else
                    g.Clear(Color.FromName("control"))
                End If
                'call the drawing functions
                DrawButton(g)
                DrawArrow(g)
                DrawBorder(g)
                DrawText(g)
                '===========STOP DRAWING============

            Case 7, 8, &H7, &H8, &H200, &H2A3
                'CMB_DROPDOWN, CMB_CLOSEUP, WM_SETFOCUS, 
                'WM_KILLFOCUS, WM_MOUSEMOVE,  
                'WM_MOUSELEAVE (if you move the mouse fast over
                'the combobox, mouseleave doesn't always react)

                UpdateState()
        End Select
    End Sub

To change the style (XP/2003), I've added a Public property:

'Property to let the user change the style
    Public Property FlatComboStyle() As styles
        Get
            Return style
        End Get
        Set(ByVal Value As styles)
            style = Value
        End Set
    End Property

Points of interest

In the combo box, there are two parts (the control itself and a kind of textbox). If the DropDownStyle is set to DropDownList, I need to draw the text manually because then there is no textbox. Because the event MouseLeave doesn't always react, a timer refreshes the control every 20 ms. Just have a look at the code and you will see how easy it is!

Thanks to

Update

  • Bug fix: Timer will be disabled while disposing! (See reactions below for more information.)
  • First revision: Some big and small bugs are now fixed! (See reactions below for more information.)
  • Second revision: 'Function' replaced by 'Private Sub' and others, and added a VB 2005 (.NET 2.0) version of the demo.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Wouter Devinck

Web Developer

Belgium Belgium

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
NewsAdvanced list box and combo box Pinmemberbrett565:41 30 Nov '05  
GeneralRe: Advanced list box and combo box PinmemberWouter Devinck6:03 30 Nov '05  
NewsRe: Advanced list box and combo box Pinmemberbrett566:26 30 Nov '05  
QuestionMemory Leak? PinmemberJerryTanski7:07 23 Nov '05  
AnswerRe: Memory Leak? PinmemberJerryTanski7:16 23 Nov '05  
GeneralRe: Memory Leak? PinmemberWouter Devinck8:45 23 Nov '05  
GeneralRe: Memory Leak? Pinmemberlegabertrand5:33 13 Dec '05  
GeneralRe: Memory Leak? PinmemberWouter Devinck7:06 13 Dec '05  
QuestionFunctions? PinmemberDodgerSharp5:10 14 Nov '05  
AnswerRe: Functions? PinmemberWouter Devinck8:01 14 Nov '05  
GeneralRe: Functions? PinmemberDodgerSharp9:13 14 Nov '05  
GeneralPermission PinmemberDodgerSharp4:53 14 Nov '05  
GeneralRe: Permission PinmemberWouter Devinck8:14 14 Nov '05  
GeneralRe: Permission PinmemberDodgerSharp9:11 14 Nov '05  
GeneralRe: Permission PinmemberWouter Devinck6:07 15 Nov '05  
Ok, can you send me a working email adress, using the email function next to reply on this message. Thanks in advance.
GeneralRe: Permission PinmemberDodgerSharp7:06 15 Nov '05  
GeneralRe: Permission PinmemberWouter Devinck7:44 15 Nov '05  
AnswerRe: Permission PinmemberDodgerSharp19:56 18 Nov '05  
GeneralNot Support DataSource Pinmemberwiratk16:29 13 Nov '05  
GeneralRe: Not Support DataSource PinmemberWouter Devinck7:54 14 Nov '05  
GeneralGreat work, A problem with large strings PinmemberSotirisF4:53 7 Nov '05  
NewsRe: Great work, A problem with large strings PinmemberWouter Devinck9:03 8 Nov '05  
GeneralRe: Great work, A problem with large strings PinmemberWouter Devinck4:58 9 Nov '05  
GeneralRe: Great work, A problem with large strings PinmemberSotirisF6:07 9 Nov '05  
GeneralExcellent PinsussAnonymous18:08 18 Sep '05  

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
Web04 | 2.5.120529.1 | Last Updated 1 Dec 2005
Article Copyright 2005 by Wouter Devinck
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid