Click here to Skip to main content
13,833,727 members
Click here to Skip to main content
Add your own
alternative version


73 bookmarked
Posted 6 May 2004

Making Standard ComboBox appear flat

, 18 May 2005
Rate this:
Please Sign up or sign in to vote.
A simple and easy class that draws the standard ComboBox as flat control.

Sample Image - flatcombo.jpg


Many flat combobox controls out there are not based on the standard ComboBox control that is supplied by .NET, instead they have their own interfaces and requires a customized type of ComboBoxItem when inserting into the Items container. If you already have code written based on the standard .NET ComboBox, changing to the flat look may also require you to modify your codes. I have personally experienced that as a problem, and someone else has brought that up as a problem as well in my recent article DateTimePicker appears Flat. Many of the information provided here may appear in the DateTimePicker appears Flat article already, or maybe explained better in there, so please check it out.

Using the Class

This class inherits from ComboBox, therefore you can use it in exactly the same way as the ComboBox control or even as a replacement.

So instead of doing this:

ComboBox  cmb = new ComboBox();

You will do:

ComboBox cmb = new FlatComboBox();
// OR
FlatComboBox cmb = new FlatComboBox();

That is how simple it is :)

Code Explanation

To achieve the flat look for the control, I have to override the WndProc method, which is the method that processes through all the window messages for this control. We are particularly interested with WM_NC_PAINT and WM_PAINT messages.

IntPtr hDC = GetWindowDC(this.Handle);

Graphics gdc = Graphics.FromHdc(hDC);

switch (m.Msg)

    case WM_NC_PAINT: 
        SendMessage(this.Handle, WM_ERASEBKGND, hDC, 0);
        SendPrintClientMsg(); // send to draw client area
        PaintFlatControlBorder(this, gdc);
        m.Result = (IntPtr) 1; // indicate msg has been processed 
    case WM_PAINT: 
        base.WndProc(ref m);
        // flatten the border area again
        Pen p = new Pen((this.Enabled? BackColor:SystemColors.Control), 2); 
        gdc.DrawRectangle(p, new Rectangle(2, 2, this.Width-3, this.Height-3));
        PaintFlatDropDown(this, gdc);
        PaintFlatControlBorder(this, gdc);
        base.WndProc(ref m);


ReleaseDC(m.HWnd, hDC);



WM_NC_PAINT message is received when the control needs to paint its border. Here I trapped the message and send WM_PRINTCLIENT message so that the ComboBox will draw its client area properly, then followed by drawing a flat border around it.

WM_PAINT message is received when the control needs to paint portion of its windows. ComboBox internally embeds a textbox and will draw the textbox with 3D border. A quick way to achieve the flat look is to paint a rectangle overlaying the 3D border of the textbox, therefore it will appear flat. We then paint the flat dropdown and border over it. Overriding the border is optional here, but I did it for the user experience where if the control is in focus, it will have a black line border or otherwise none.


Currently, this FlatComboBox does not draw with ComboBox.Simple style. When this style is set for the ComboBox object, this class will let the base class perform the standard drawing.


  • 18 May 2005
    • DROPDOWNWIDTH value is dynamic now based on the system setting hence will work well in different screen resolutions.
    • Only acquires and creates window DC when necessary.


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

Fadrian Sudaman
Architect SMS Management and Technology
Australia Australia
Fadrian Sudaman is an experienced IT professional who has worked with .NET technology since the early beta. His background stems from a strong C/C++ development experience in building large commercial applications and great appreciation for best practice and modern approaches for building quality software. Currently, Fadrian works as a senior consultant specialises in .NET technology involved in variety of roles including project management, solution architecture, presales and application development. Fadrian is also completing his PhD part time at Monash University, Australia.

You may also be interested in...


Comments and Discussions

AnswerRe: why win32? Pin
Fadrian Sudaman24-Jul-07 14:36
memberFadrian Sudaman24-Jul-07 14:36 
Generalgood job! Pin
apache1o5-Jun-07 13:24
memberapache1o5-Jun-07 13:24 
GeneralC3 Pin
Thimani3-Apr-07 20:47
memberThimani3-Apr-07 20:47 
Questionhow to make standard TextBox appear flat Pin
superkaier13-Apr-06 18:01
membersuperkaier13-Apr-06 18:01 
AnswerRe: how to make standard TextBox appear flat Pin
Fadrian Sudaman17-Apr-06 17:37
memberFadrian Sudaman17-Apr-06 17:37 
GeneralSupport for .net 2005 Pin
huppy1014-Jan-06 1:59
memberhuppy1014-Jan-06 1:59 
GeneralRe: Support for .net 2005 Pin
Fadrian Sudaman4-Jan-06 2:25
memberFadrian Sudaman4-Jan-06 2:25 
I tested and it actually works fine. I start to suspect it is either the installed framework is corrupted or perhaps you have a later operating system then what I'm running?

Also, if you are using VS2005, wouldn't it be just as easy to just use the standard combobox provided - which is now have the proper flat mode?

GeneralRe: Support for .net 2005 Pin
huppy1014-Jan-06 3:48
memberhuppy1014-Jan-06 3:48 
GeneralRe: Support for .net 2005 PinPopular
Fadrian Sudaman4-Jan-06 22:02
memberFadrian Sudaman4-Jan-06 22:02 
GeneralRe: Support for .net 2005 Pin
qumer10126-May-07 8:18
memberqumer10126-May-07 8:18 
NewsAdvanced list box and combo box Pin
brett5630-Nov-05 6:42
memberbrett5630-Nov-05 6:42 
Generalimplementing css in combo box Pin
luv u ajay24-Nov-05 19:15
memberluv u ajay24-Nov-05 19:15 
GeneralRe: implementing css in combo box Pin
Fadrian Sudaman29-Nov-05 14:16
memberFadrian Sudaman29-Nov-05 14:16 
GeneralBetter apperance Pin
martin hoge28-Oct-05 4:19
membermartin hoge28-Oct-05 4:19 
GeneralRe: Better apperance Pin
Fadrian Sudaman1-Nov-05 12:44
memberFadrian Sudaman1-Nov-05 12:44 
GeneralRight To Left Pin
booky1-Sep-05 6:36
memberbooky1-Sep-05 6:36 
GeneralRe: Right To Left Pin
Fadrian Sudaman3-Sep-05 23:39
memberFadrian Sudaman3-Sep-05 23:39 
GeneralThanks, but one problem Pin
Serdar YILMAZ24-May-05 3:22
memberSerdar YILMAZ24-May-05 3:22 
GeneralRe: Thanks, but one problem Pin
jucysoft25-May-05 2:27
memberjucysoft25-May-05 2:27 
GeneralRe: Thanks, but one problem Pin
Serdar YILMAZ25-May-05 2:34
memberSerdar YILMAZ25-May-05 2:34 
GeneralRe: Thanks, but one problem Pin
Fadrian Sudaman31-May-05 18:22
memberFadrian Sudaman31-May-05 18:22 
GeneralRe: Thanks, but one problem Pin
Serdar YILMAZ1-Jun-05 23:22
memberSerdar YILMAZ1-Jun-05 23:22 
GeneralRe: Thanks, but one problem Pin
Le_MuLoT15-Nov-05 4:33
memberLe_MuLoT15-Nov-05 4:33 
GeneralGreat control, but a couple of questions Pin
daniilzol13-May-05 4:26
memberdaniilzol13-May-05 4:26 
GeneralRe: Great control, but a couple of questions Pin
Fadrian Sudaman14-May-05 18:23
memberFadrian Sudaman14-May-05 18:23 

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.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web01 | 2.8.190114.1 | Last Updated 18 May 2005
Article Copyright 2004 by Fadrian Sudaman
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid