A multi-select tree control class

Sample Image

Environment: VC6 SP2

There have already been several implementations of a multi-select tree control posted to CodeGuru, but none of them have provided the functionality and/or behaviour I required.

The versions I have seen take the approach of handling the selection around the mouse-down, mouse-move and mouse-up messages, with variables holding state in-between. CMultiTree takes the approach of handling the whole multi-selection within the mouse-down handler. This is a closer approach to the underlying Windows treeview control.

CMultiTree attempts to mirror the selection behaviour of a CListCtrl (listview control) class. In fact the code was developed by putting a CListCtrl next to a CTreeCtrl and trying the combinations of mouse clicks/drags, and key presses. CMultiTree thus has full rubber-band selection support.

The sample application implements the CTreeCtrl in a CTreeView class, using a method described on a CodeGuru site. Unfortunately I can't find the original article to credit the author [hopefully the editor can do this on my behalf].

Usage

Multiple-selection in CMultiTree should be done in more or less the same way as in a CListCtrl, i.e. using SetItemState, GetItemState. I have taken the liberty of defining a TVIS_FOCUSED (the equivalent of LVIS_FOCUSED of the CListCtrl).

SetItemState / GetItemState:

These two methods have been over-scoped in the CMultiTree class to replace the underlying CTreeCtrl versions. Because they are NOT virtual, they must be called in the scope of the CMultiTree class (or derived class), otherwise they will not work, e.g.:


    /* if m_tree is a CMultiTree */
    CTreeCtrl *pTree = &m_tree;
    UINT nState = pTree->GetItemState(hItem, TVIS_FOCUSED|TVIS_SELECTED);

this will NOT call the CMultiTree version because of the non-virtual GetItemState.

Examine the header file for other methods, they are pretty self-explanatory.

Comments: mailto:comments@tinuviel.demon.co.uk
Info: http://www.tinuviel.demon.co.uk/source_code/sc_multitree.htm
Copyright (c) 1999 Richard Hazlewood.

Downloads

Download demo project - 34 Kb



Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Instead of only managing projects organizations do need to manage value! "Doing the right things" and "doing things right" are the essential ingredients for successful software and systems delivery. Unfortunately, with distributed delivery spanning multiple disciplines, geographies and time zones, many organizations struggle with teams working in silos, broken lines of communication, lack of collaboration, inadequate traceability, and poor project visibility. This often results in organizations "doing the …

  • With JRebel, developers get to see their code changes immediately, fine-tune their code with incremental changes, debug, explore and deploy their code with ease (both locally and remotely), and ultimately spend more time coding instead of waiting for the dreaded application redeploy to finish. Every time a developer tests a code change it takes minutes to build and deploy the application. JRebel keeps the app server running at all times, so testing is instantaneous and interactive.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds