Topics: CTreeCtrl, CListCtrl,
SetItemData, GetItemData, InsertItem
MFC Tree Control: How to use 'SetItemData()' and 'GetItemData()'?
How to use 'GetItemData()'
A: A tree
control is just a visual representation of some
hierarchical data structure. You use 'SetItemData()'
and 'GetItemData()' to
link each tree item to a node if this data structure.
Firstly you have to define a class or a structure that
holds the data for each node. For example if your tree is
supposed to show a file system, the structure you define
will reflect all the properties of a file, like name,
size, timestamp, whether it is a directory or not, access
rights and so on. The tree will display only the name.
Each of the trees items will be linked to an instance of
such a structure.
allows you to attach a 'DWORD' to each item and 'GetItemData()'
allows you to get that 'DWORD' back. A plain 'DWORD' isn't
of much use, but luckily under Windows a 'DWORD' and a
pointer have the same size, so you can cast forth and back
When you add an item to the tree, you attach a pointer to
a 'node_data' structure to that item:
hItem = m_tree.InsertItem(/*...*/);
node_data *node =
// Fill up the new node
// Attach the node to the item
handle an operation on some item of the tree (for example
selection) you retrieve the node using 'GetItemData()':
is a valid iten handle
node_data *node =
(node_data *) m_tree.GetItemData(hItem);
// Retrieve, set or take
decisions according to the nodes
value = node->member;
Control: How to disable an item in Tree
How to disable an item?
A: Tree items do not have
enabled/disabled states. That means that you can stop
searching for a function called 'SetItemEnabled()',
because it does not exist. You have to simulate this by
your own. Let's outline what you need to do in order to
'disable' an item:
to mark that item as 'disabled'. As the tree control
itself doesn't help here, you need to reserve a flag
in the underlaying structure of each item. You will
to set and retrieve this structure for each item.
to give some visual feedback to your user that the
item is disabled. The easiest solution is to use a
special (grayed) icon for the item. You can refine
this approach up to changing the items color or font.
to prevent some operations on that item, like
expanding, selecting, dragging it or dropping on it.
We assume that for each item you have correctly set an
underlaying data structure called 'CItemStruct', and
this has a boolean member 'm_bDisabled'.
selection: (handle TVN_SELCHANGING)
pNMHDR, LRESULT* pResult)
NM_TREEVIEW* pNMTreeView =
*pResult = 1;
*pResult = 0;
Control: How to correctly delete items from a
How to correctly delete items from a CListCtrl?
A: Unlike the 'HTREEITEM' values returned
the integer values returned from 'CListCtrl::InsertItem()'
aren't stable. In short, this means that you shouldn't
store them anywhere. If you need to find an entry again,
it's probably best to simply put something useful in 'LVITEM::lParam',
and search for it using 'CListCtrl::GetNextItem()'.
Having said that, one can use the following piece of code
to correctly delete items from a CListCtrl:
LVIS_SELECTED) == LVIS_SELECTED)