如何在c++中遍历treeview控件的所有父节点?
Posted
技术标签:
【中文标题】如何在c++中遍历treeview控件的所有父节点?【英文标题】:How to iterate through all parent nodes of treeview control in c++? 【发布时间】:2015-09-18 15:15:39 【问题描述】:我是 C++ 新手。有没有办法从树开始遍历所有父节点?
例如:
ParentNode1->Child1
->Child2
ParentNode2->Child1
->Child2
我想从 ParentNode1 迭代到 ParentNode2。
请推荐。
【问题讨论】:
【参考方案1】:使用以下函数遍历MFCCTreeCtrl
:
void TraverseTree(CTreeCtrl* pTreeCtrl)
TraverseTreeBranch(pTreeCtrl, pTreeCtrl->GetRootItem(), TVI_ROOT);
void TraverseTreeBranch(CTreeCtrl* pTreeCtrl, HTREEITEM hItem, HTREEITEM hParentItem)
// Do stuff with hItem here
HTREEITEM hItemTmp = pTreeCtrl->GetChildItem(hItem);
while(hItemTmp != NULL)
TraverseTreeBranch(pTreeCtrl, hItemTmp, hNewItem);
hItemTmp = GetNextSiblingItem(hItemTmp);
【讨论】:
这个答案中的代码没有解决这个问题。实施时,它访问所有节点。由于它实现了深度优先迭代(相对于广度优先),同一级别的节点迭代与递归调用混合在一起,并且比必要的更难遵循。如果你去掉所有不相关的代码并只显示一个简单的TraverseSiblings
函数,它会得到一个更好的答案。【参考方案2】:
CTreeView 类包装了一个 CTreeCtrl 对象。后者提供CTreeCtrl::GetNextSiblingItem/CTreeCtrl::GetPrevSiblingItem。这些成员返回下一个/上一个树视图项,它位于同一层次结构级别。
如果您正在寻找 Windows API 解决方案,请改用 TreeView_GetNextSibling/TreeView_GetPrevSibling 宏,或发送 TVM_GETNEXTITEM 消息。
【讨论】:
以上是关于如何在c++中遍历treeview控件的所有父节点?的主要内容,如果未能解决你的问题,请参考以下文章
如何在窗体初始化的时候就展开所有TreeView控件的所有节点
C#如何在treeview控件winform的所有父子节点中搜索文本