Click here to Skip to main content
13,356,787 members (74,182 online)
Click here to Skip to main content
Add your own
alternative version


64 bookmarked
Posted 29 Dec 2010

A Multi-selectable Tree Control Supports Transparent Selection Rectangle

, 29 Dec 2010
Rate this:
Please Sign up or sign in to vote.
A multi-select tree control that is based on Richard's implementation


Sometimes, we need a tree control that allows the user to select multiple items at a time, but this feature is not provided by the standard common controls. Thanks to Richard Hazlewood's great article, this feature has been implemented nicely. However, Richard's implementation only supports the simple style rubber band selection. What I want to have is a tree control that implements an alpha-blended selection rectangle (just like explorer does).

Eugen Podsypalnikov did give us an approach to that with his CCoverWnd class, but the focus issue and CWnd derived implementation makes me think that maybe implementing the selection drawing by the tree control itself would be a better idea, so here comes the CMultiSelTriCheckTreeCtrl class in MFC.

The demo project actually belongs to my another humble article CVComboBox, so the download URLs are shared here.

As the snapshot shown, the tree control can have tri-states checkboxes display for each item, and all the selected items will be checked/unchecked when you click the checkbox of one of them. If you want to only check/uncheck the very item which is being selected, you can click the checkbox while holding the control key down.



Interfaces of CMultiSelTriCheckTreeCtrl

CMultiSelTriCheckTreeCtrl is an MFC wrapper class that encapsulates the multi-select tree control, it derives from another MFC wrapper class called CTriCheckStateTreeCtrl, which implements a tri-check state tree control.

The interfaces of CMultiSelTriCheckTreeCtrl are quite similar to those of CMultiTree by Richard Hazlewood since I just simply changed the selection drawing code after all, here are the public interfaces:

inline BOOL IsMultiSelectable() const ;

void  SetMultiSelectable(BOOL bMultiSel = TRUE);

inline BOOL IsSelected(HTREEITEM hItem) const;

size_t  GetSelectedCount() const;
HTREEITEM GetFirstSelectedItem() const;
HTREEITEM GetNextSelectedItem(HTREEITEM hItem) const;
HTREEITEM GetPrevSelectedItem(HTREEITEM hItem) const;

void  SelectAll(BOOL bSelect = TRUE);
void  SelectRange(HTREEITEM hFirst, HTREEITEM hLast, BOOL bOnly = TRUE);

//Note: not virtual, so must call this class (or derivative)
BOOL  SetItemState(HTREEITEM hItem, UINT nState, UINT nStateMask);
UINT  GetItemState(HTREEITEM hItem, UINT nStateMask) const;

virtual void ToggleCheckSelectedItem();
virtual void DeleteSelectedItem();

void  GetSelectedList(TreeItemList& selectedList) const;

The Basic Steps to Use CMultiSelTriCheckTreeCtrl in a Dialog Based Application

Here are the basic steps to show how to use the class CMultiSelTriCheckTreeCtrl:

  1. Create a dialog based MFC project called CMultiSelTreeDemo.
  2. Add the following source files (under the folder code_base) into your workspace:
    • CustomDrawCommon.cpp
    • CustomDrawCommon.h
    • CustomDrawControl.cpp
    • CustomDrawControl.h
    • CustomDrawUtils.cpp
    • CustomDrawUtils.h
  3. Open the precompiled header file, which is normally StdAfx.h, append this line to it:
    #include "..\code_base\CustomDrawCommon.h"
  4. If you are using Visual Studio 6.0, you also need to put these at the beginning of StdAfx.h:
    #pragma warning(disable: 4786)  // try to disable the annoying warning in VC6
    #ifndef WINVER
     #define WINVER 0x0501
    #endif // WINVER
    #ifndef _WIN32_WINNT
     #define _WIN32_WINNT 0x0501
    #endif // _WIN32_WINNT
  5. Open the dialog with resource editor, drag and drop a tree control from the control toolbar to the dialog.
  6. Add a corresponding control member variable to that tree control, name it like m_myTreeCtrl, the IDE will add the necessary code for you, it would look like:
    CTreeCtrl m_myTreeCtrl;
  7. Open the header file of the dialog class, put the #include directive to the beginning of it like this:
    #include "..\code_base\CustomDrawControl.h"
  8. Rename the type of m_myTreeCtrl from CTreeCtrl to CMultiSelTriCheckTreeCtrl.


  • 2010-12-29: Initial release


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


About the Author

Software Developer
China China
No Biography provided

You may also be interested in...


Comments and Discussions

GeneralMy vote of 5 Pin
Member 125249613-Jun-16 6:10
memberMember 125249613-Jun-16 6:10 
GeneralMy vote of 5 Pin
yulingfeng21-Apr-13 17:29
memberyulingfeng21-Apr-13 17:29 
A good job ,thanks
GeneralMy vote of 5 Pin
justdownloads13-Dec-12 1:44
memberjustdownloads13-Dec-12 1:44 
QuestionTreeCtrl MultiSelection Issue Pin
ReneG21-Feb-12 4:45
memberReneG21-Feb-12 4:45 
GeneralMy vote of 5 Pin
Member 429669513-Jan-11 1:33
memberMember 429669513-Jan-11 1:33 
GeneralMy vote of 5 Pin
skyformat99@gmail.com12-Jan-11 21:01
memberskyformat99@gmail.com12-Jan-11 21:01 
Generalnice Pin
CIDev7-Jan-11 7:50
memberCIDev7-Jan-11 7:50 
GeneralMy vote of 5 Pin
Weiyou Mao4-Jan-11 20:51
memberWeiyou Mao4-Jan-11 20:51 
GeneralMy vote of 5 Pin
pd964-Jan-11 16:55
memberpd964-Jan-11 16:55 
GeneralMy vote of 4 Pin
mnjrupp4-Jan-11 7:48
membermnjrupp4-Jan-11 7:48 
GeneralMy vote of 4 Pin
SledgeHammer0131-Dec-10 14:21
memberSledgeHammer0131-Dec-10 14:21 
GeneralRe: My vote of 4 Pin
yonken1-Jan-11 3:46
memberyonken1-Jan-11 3:46 
GeneralRe: My vote of 4 Pin
SledgeHammer011-Jan-11 14:17
memberSledgeHammer011-Jan-11 14:17 
GeneralRe: My vote of 4 [modified] Pin
yonken3-Jan-11 7:17
memberyonken3-Jan-11 7:17 
GeneralRe: My vote of 4 Pin
SledgeHammer013-Jan-11 11:21
memberSledgeHammer013-Jan-11 11:21 
GeneralRe: My vote of 4 [modified] Pin
yonken4-Jan-11 3:09
memberyonken4-Jan-11 3:09 
GeneralMy vote of 5 Pin
RaviRanjankr29-Dec-10 20:36
memberRaviRanjankr29-Dec-10 20:36 
GeneralGreat Job, i love it Pin
Roberto Guerzoni29-Dec-10 6:43
memberRoberto Guerzoni29-Dec-10 6:43 

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
Web03 | 2.8.180111.1 | Last Updated 29 Dec 2010
Article Copyright 2010 by yonken
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid