Click here to Skip to main content
13,056,229 members (83,162 online)
Click here to Skip to main content
Add your own
alternative version


59 bookmarked
Posted 24 Jun 2002

Category Listbox

, 24 Jun 2002
Rate this:
Please Sign up or sign in to vote.
This control mimics the behavior of Microsoft Outlook's categorized listbox.
<!-- Download Links -->
Without checkboxes. (Default)With checkboxes.


This control mimics the behavior of Microsoft Outlook's categorized listbox. It displays a list of categories and each category has its own list of items. Categories can be opened to reveal their items or closed to hide them. The idea is to help improve list organization and to make it easier for users to find what they are looking for.

Categories have the following attributes:

  • Are indicated in the list with a grey background.
  • Category name must be unique. (They are case sensitive.)
  • Can have 0 to N items under them.
  • Have open/close buttons to show/hide their items.
  • Can be opened/closed by double clicking them or by pressing the space bar.

Category items have the following attributes:

  • Must be assigned to a category.
  • Item name does not have to be unique.
  • Can have a checkbox displayed next to it. (Microsoft Outlook does not have this feature.)
  • Checkboxes can be checked/unchecked by clicking them or by pressing the space bar.
  • Items can store DWORD data with them. (CListBox has this feature.)

Other supported features:

  • Sorts categories and their items if the LBS_SORT style has been set.
  • Supports selection modes Single, Multiple, Extended, and None.
  • SHOULD support unicode. (I haven't verified this.)


The category listbox class is derived from the MFC CListBox class. Most of CListBox’s functions can still be used, however, some functions have been protected thereby forcing you to use this class's functions instead. You cannot use the following CListBox functions with this class:
AddString( LPCTSTR pString );
InsertString( int iIndex, LPCTSTR pString );
DeleteString( int iIndex );
GetItemData( int iIndex );
SetItemData( int iIndex, DWORD dwValue );

The category listbox class has been made as simple as possible to make it easy for you to add this control to your project. You only need to add the files "CatListBox.cpp" and "CatListBox.h" to your project. That's it! You do not have to add any images to your resource file because this class draws its buttons and checkboxes itself.

To add this control to your dialog, do the following:

  1. Add a listbox to your dialog's resource.
  2. Setup your listbox's resource for "Owner Draw: Fixed" and check "Has Strings".

  3. Create a CCatListBox member variable in your dialog's code. For example...
    #include "CatListBox.h"
    class MyDialog : public CDialog
       // Dialog Data
       //{{AFX_DATA( MyDialog )
       enum { IDD = IDD_MY_DIALOG };
       CCatListBox   m_lstCategories;        // Create your variable here.
    // Subclass the listbox here.
    // Make sure to replace IDC_LISTBOX_ID with the one you're using.
    void MyDialog::DoDataExchange( CDataExchange* pDX )
       CDialog::DoDataExchange( pDX );
       //{{AFX_DATA_MAP( MyDialog )
       DDX_Control( pDX, IDC_LISTBOX_ID, m_lstCategories );   // Subclass it!


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


About the Author

Joshua Quick
Software Developer (Senior)
United States United States
No Biography provided

You may also be interested in...


Comments and Discussions

QuestionLicence? Pin
peterchen14-Jan-09 22:53
memberpeterchen14-Jan-09 22:53 
AnswerRe: Licence? Pin
Joshua Quick15-Jan-09 19:29
memberJoshua Quick15-Jan-09 19:29 
GeneralRe: Licence? Pin
peterchen15-Jan-09 20:43
memberpeterchen15-Jan-09 20:43 
GeneralRe: Licence? Pin
Joshua Quick15-Jan-09 21:19
memberJoshua Quick15-Jan-09 21:19 
GeneralExcellent piece of code! Pin
Karen030223-Aug-03 6:08
memberKaren030223-Aug-03 6:08 
GeneralHighlighting Pin
dudic27-Apr-03 9:00
memberdudic27-Apr-03 9:00 
GeneralRe: Highlighting Pin
Joshua Quick28-Apr-03 7:36
memberJoshua Quick28-Apr-03 7:36 
GeneralVery good - Could expand a bit more on how it works Pin
Paul Belikian26-Sep-02 12:01
memberPaul Belikian26-Sep-02 12:01 

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 | Terms of Use | Mobile
Web01 | 2.8.170728.5 | Last Updated 25 Jun 2002
Article Copyright 2002 by Joshua Quick
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid