【问题标题】:How to iterate through all parent nodes of treeview control in c++?如何在c++中遍历treeview控件的所有父节点?
【发布时间】:2015-09-18 15:15:39
【问题描述】:

我是 C++ 新手。有没有办法从树开始遍历所有父节点?

例如:

ParentNode1->Child1
           ->Child2

ParentNode2->Child1
           ->Child2

我想从 ParentNode1 迭代到 ParentNode2。

请推荐。

【问题讨论】:

    标签: c++ mfc treeview


    【解决方案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 消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 2011-12-28
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2015-01-19
      • 1970-01-01
      相关资源
      最近更新 更多