如何在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的所有父子节点中搜索文本

winform 中Treeview控件怎样选中父节点时子节点全部展开,选中其他父节点时原先展开的关闭

Delphi TreeView 选择父节点,选择所有子节点

C#中如何设置treeview每个节点背景图片及背景颜色

关于的Delphi 的treeview控件的用法请教大家