一、从指定节点开始查找LPARAM等于指定值的树节点
思路:
首先,检查当前节点是否符合要求,是则返回当前节点。
其次,若当前节点有子节点,则遍历子节点。
最后,若当前节点有兄弟节点,则遍历兄弟节点。
返回值:若找到符合条件的节点,则返回该节点,否则,返回NULL。
二、案例
HTREEITEM CDepartmentManageDlg::FindTreeItem(HTREEITEM hItem,LPARAM lParentId)
{
HTREEITEM hTreeItem;
HTREEITEM hChildItem;
HTREEITEM hSiblingItem;
// 检查当前节点是否符合要求
DWORD dwId = dptTree.GetItemData(hItem);
if (dwId == lParentId)
{
return hItem;
}
// 搜索当前节点的子节点
TVITEM item;
item.mask = TVIF_CHILDREN | TVIF_HANDLE;
item.hItem = hItem;
dptTree.GetItem(&item);
if (item.cChildren == 1) // 等于1说明有子节点
{
hChildItem = dptTree.GetNextItem(hItem,TVGN_CHILD);
if (hChildItem != NULL)
{
hTreeItem = FindTreeItem(hChildItem,lParentId);
if (hTreeItem != NULL)
{
return hTreeItem;
}
}
}
// 搜索兄弟结点
hSiblingItem = dptTree.GetNextSiblingItem(hItem);
while(hSiblingItem != NULL)
{
hTreeItem = FindTreeItem(hSiblingItem,lParentId);
if (hTreeItem != NULL)
{
return hTreeItem;
}
hSiblingItem = dptTree.GetNextSiblingItem(hSiblingItem);
}
return NULL;
}