Click here to Skip to main content
Click here to Skip to main content

CheckComboBox Control

By , 24 Nov 1999
 

Sample Image

Introduction

What does a CheckComboBox control do? A combo box has always been a way of selecting one item from a list of several. If you need to select one or more items, you have to either use a multiple selection listbox or use the MFC's CCheckListBox. The only problem is that it takes up space in your dialog or form. What you need is a CCheckComboBox!

When I started to develop the control, I was planning to design a composite control consisting of a static control along with a small button. When clicking the button, a popup window would be displayed where the user could select or unselect the items. The problem was that it took too much code to implement. I wanted the look and feel just like a standard combo box and that was not possible with a reasonable amount of code.

So I decided to subclass the combo box. A problem when subclassing the combo box is that you have no window handle to the list portion of the combo box that you may subclass. You only have the combo box window handle and that doesn't help.

The trick is to listen to the WM_CTLCOLORLISTBOX message. When the WM_CTLCOLORLISTBOX message is sent, lParam contains the window handle of the list box. This is the time to do the subclassing.

The code below shows how this is done:

BEGIN_MESSAGE_MAP(CCheckComboBox, CComboBox)
    ...
    ON_MESSAGE(WM_CTLCOLORLISTBOX, OnCtlColorListBox)
    ...
END_MESSAGE_MAP()

...
LRESULT CCheckComboBox::OnCtlColorListBox(WPARAM wParam, LPARAM lParam) 
{
    // If the listbox hasn't been subclassed yet, do so...
    if (m_hListBox == 0) {
        HWND hWnd = (HWND)lParam;

        if (hWnd != 0 && hWnd != m_hWnd) {
           // Save the listbox handle
           m_hListBox = hWnd;

           // Do the subclassing
           m_pWndProc = (WNDPROC)GetWindowLong(m_hListBox, GWL_WNDPROC);
           SetWindowLong(m_hListBox, GWL_WNDPROC, (LONG)ComboBoxListBoxProc);
        }
    }


    return DefWindowProc(WM_CTLCOLORLISTBOX, wParam, lParam);
}

After this is done, the rest is fairly straight forward. The ComboBoxListBoxProc() routine takes care of selecting/unselecting items and key down events. The overridden DrawItem() routine draws both the list items and the static portion of the combo box. If it is an item, it draws a checkmark followed by the text. If it is the static portion, it draws the text from all selected items separated by the standard list separator.

Please note that the CCheckComboBox must be created with the CBS_DROPDOWNLIST and the CBS_OWNERDRAWVARIABLE styles set. Also the CBS_HASSTRINGS style must be specified since I let the combo box handle the item strings (sorting etc.).

Since the check mark information is stored in the combo box item data, this may not be used by the application. Setting it to zero unselects the item otherwise it selects the item. But use the GetCheck() and SetCheck() routines instead since they handle redrawing correctly. If you need your own item data, you must implement this yourself.

It is easy to use this control since it is derived from the MFC CComboBox. Add CheckComboBox.h and CheckComboBox.cpp to your project and use it as a standard CComboBox. When used inside a dialog, simply select the category "Control" and variable type "CCheckComboBox" under the "Member Variables" page of the Class Wizard. This will declare a member variable in your dialog of type CCheckComboBox ready for you to use.

Well, I hope someone finds this useful. At least I did.

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

Magnus Egelberg, Lundalogik
Sweden Sweden
Member
No Biography provided

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

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionUnable to increase drop down wdithmemberNipunG25 Sep '12 - 20:44 
QuestionCBN_SELCHANGE?memberbosfan31 Jul '12 - 1:31 
BugWin x64 failmemberAJG8514 May '12 - 13:13 
GeneralRe: Win x64 failmemberAJG8515 May '12 - 11:40 
QuestionHow to use GetDlgItem()memberamitwadekar17 Jan '12 - 2:08 
GeneralMy vote of 5memberEmmo2 Jun '11 - 5:20 
GeneralMy vote of 5memberPhil Outram6 Aug '10 - 5:00 
GeneralMy vote of 1memberxinkmt3 Aug '10 - 15:09 
GeneralBug - before subclassing behaviormemberJohn59027 Aug '09 - 0:37 
GeneralRe: Bug - before subclassing behavior...and fix to get arrow keys opening drop down boxmemberPhil Outram6 Aug '10 - 5:23 
GeneralExcellent controlmembersimbakid26 Mar '09 - 22:14 
Questioncombobox show only one item at dropdownmemberrotalume17 Jan '09 - 6:16 
AnswerRe: combobox show only one item at dropdownmemberrotalume18 Jan '09 - 18:55 
QuestionCan you give more explain?memberparadise of pig20 Oct '08 - 8:35 
GeneralCan't see the List after click on the combo box.membernankyu119 Oct '08 - 20:25 
GeneralRe: Can't see the List after click on the combo box.memberMagnus Egelberg19 Oct '08 - 20:35 
GeneralRe: Can't see the List after click on the combo box.membernankyu119 Oct '08 - 21:05 
GeneralRe: Can't see the List after click on the combo box.memberMartin Chapman20 Jan '10 - 17:20 
GeneralRe: Can't see the List after click on the combo box.memberMartin Chapman20 Jan '10 - 17:27 
Generalwhere can i find a version written by c#memberlinzhuo25 Jun '08 - 22:10 
GeneralLicensememberlanreola26 Mar '08 - 6:12 
QuestionRe: LicensememberScott Bartine6 Dec '11 - 10:11 
Questionhow to disable check box selection ?membermrgoos19 Aug '07 - 4:40 
QuestionTool tip for Combo contolmembersajithomas21 Jun '07 - 22:52 
GeneralUsing CheckComboBoxmemberjives30 Apr '07 - 2:52 
QuestionWhy not CB_GETCOMBOBOXINFO?membertworca13 Apr '07 - 8:38 
AnswerRe: Why not CB_GETCOMBOBOXINFO?memberMagnus Egelberg15 Apr '07 - 20:29 
GeneralRe: Why not CB_GETCOMBOBOXINFO?memberNotre5 Nov '07 - 9:46 
Generalcombocheckboxmemberdnldldrch6 Dec '06 - 13:21 
GeneralRe: combocheckboxmemberMagnus Egelberg6 Dec '06 - 22:53 
QuestionOn resizing the dropdown list does not show upmemberhoc_ngo15 May '06 - 13:15 
GeneralBugmemberMarek Konopka14 Mar '06 - 3:37 
GeneralRe: BugmemberMarek Konopka14 Mar '06 - 3:51 
Questionhow to change it to the dropdown stylememberminibao6 Feb '06 - 2:52 
AnswerRe: how to change it to the dropdown stylemember.dan.g.9 Mar '06 - 14:51 
GeneralRe: how to change it to the dropdown stylememberMember 411759710 Nov '08 - 3:06 
GeneralMutiple selection in the drop-down list boxmemberlanreola31 Aug '05 - 11:05 
GeneralRe: Mutiple selection in the drop-down list boxmember.dan.g.9 Mar '06 - 14:58 
GeneralFlat CheckboxmemberRafal Glowinski19 Jul '04 - 8:03 
GeneralThis is just what I needmemberedger5 Feb '04 - 19:29 
Generalondropdown eventmemberGAOFENG00712 Nov '03 - 16:05 
QuestionWinCE?memberajh5 Sep '03 - 18:32 
AnswerRe: WinCE?memberJoão Paulo Figueira2 Oct '03 - 0:13 
GeneralRe: WinCE?memberajh2 Oct '03 - 5:11 
GeneralRe: WinCE?memberJoão Paulo Figueira7 Oct '03 - 10:21 
GeneralLicensememberstevev@fieldbusinc.com9 Apr '03 - 3:54 
GeneralRe: Licensemembernarm gadiraju28 Aug '03 - 9:08 
GeneralRe: LicensememberMagnus Egelberg28 Aug '03 - 21:20 
GeneralRe: LicensememberCode-X5 Nov '03 - 12:02 
GeneralRe: LicensememberAnton Heidelwalder10 Nov '04 - 2:05 

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

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 25 Nov 1999
Article Copyright 1999 by Magnus Egelberg, Lundalogik
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid