Download demo project - 60 Kb
Download source files - 21 Kb
<!-- Article Starts -->
The Treelist control is a combination Tree/List control derived from CTreeCtrl.
Here's the description of the classes that are used:
- CTLFrame - derived from CWnd, this class is the frame
class for the treelist control. It is used to include
the header control, the tree itself, and the horizontal
CNewHeaderCtrl - derived from CHeaderCtrl.
Used as the header in the TreeList.
CNewTreeListCtrl - derived from CTreeCtrl,
used as the main tree in the TreeList.
CTLItem - represents each item inside the
SSortType - structure that's used to
indicate whether the sort of the tree is in an ascending
order or descending, and which column is being sorted.
How to insert TreeList into your project?
- Insert the following files into your project:
- TLFrame.cpp, TLFrame.h
- NewTreeListCtrl.cpp, NewTreeListCtrl.h
- NewHeaderCtrl.cpp, NewHeaderCtrl.h
- Include the file "TLFrame.h" in the app file (where
the InitInstance function is) and insert the following line in
the InitInstance function:
- Layout a user-defined control inside the dialog into which
the control is supposed to be intserted. In the class field type:
- Include "TLFrame.h" in the dialog's header file,
and add a member variable:
- In your OnInitDialog() or OnCreate() functions subclass the
That's it !
Using the TreeListCtrl
The use of the control is simple. It's a tree, so treat it as
one (HTREEITEM etc.). In addition, there are functions like
InsertColumn, SetItemText, SetItemColor, SetItemBold, GetItemText.
Here's my approach to implementing the TreeList. First of all,
I had to create a frame window, that would include the 3 objects:
header, tree, horz scroll bar. That's what CTLFrame is for. In
addition, this CWnd derived class helps during the scroll: the
header is clipped after it's repositioned, so there's a feeling
The class CNewHeaderCtrl was created only to put the 3d
triangles in it. I decided to include sorting since it's needed
in 9/10 cases, and it's a shame every programmer needs to insert
it by himself. Finally, CNewTreeListCtrl is the more complicated
part. Every item inside the tree, has a DWORD data associated
with it, that stores a pointer to a CTLItem class. CTLItem stores
the information about each item- its columns' strings, whether
the item is bold, the item's color, and the item data that the
user wishes to associate with the item. All the functions that
deal with the items, like InsertItem, DeleteItem, SetItemText etc.
were overridden in order to use the CTLItem technique.
I had some difficulties with the scrolling part, since there
are many different conditions for the scroll bars: vertical
scroll is shown and then the horz becomes shorter, it's hidden so
the horz should become larger again; what happens if the users
changed some column's size... and problems like that. I believe I
handle each of these cases so I think there won't be any problems
with this part.