MFC之TreeCtrl遍历所有节点
阅读原文时间:2023年07月09日阅读:2

这个例子,主要是查找树上的某个节点,并展开选中它。采用来了递归方法来实现。主要用到的方法:

CTreeCtrl::GetChildItem
HTREEITEM GetChildItem( HTREEITEM hItem );
返回值:如果成功则返回该子项的句柄;否则返回NULL。

采用递归的思想,把每个遍历到的节点都当作根节点对待,然后遍历他里面的儿子节点。
儿子节点又当作根节点,这样反复,直到真正的根节点都遍历完了,整个过程就结束了。说得不清楚,看代码一目了然。

按钮代码

void CForTreeCtrlDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码

UpdateData(TRUE);

vector<HTREEITEM>vecItem;  
HTREEITEM root = treeCtrl.GetRootItem();  
//第一层根节点  
while (root != NULL) {

    vecItem.push\_back(root);  
    root = treeCtrl.GetNextItem(root, TVGN\_NEXT);  
}  
for (int q = (int)vecItem.size() - 1; q > -1; q--) {  
    func(vecItem\[q\], m\_find);  
}

}

递归函数

void CForTreeCtrlDlg::func(HTREEITEM root,CString condition) {

CString itemText = treeCtrl.GetItemText(root);

if (itemText.Find(condition) != -1) {

    treeCtrl.SelectItem(root);  
    treeCtrl.SetCheck(root, TRUE);  
    treeCtrl.Expand(root, TVM\_EXPAND);  
    return;  
}  
//根节点的儿子节点  
HTREEITEM A1 = treeCtrl.GetChildItem(root);

//儿子节点的兄弟节点  
vector<HTREEITEM>vecItem;

while (A1 != NULL) {

    vecItem.push\_back(A1);  
    A1 = treeCtrl.GetNextItem(A1, TVGN\_NEXT);  
}

for (int q = (int)vecItem.size() - 1; q > -1; q--) {

    CString itemText = treeCtrl.GetItemText(vecItem\[q\]);

    if (itemText.Find(condition) != -1) {

        treeCtrl.SelectItem(vecItem\[q\]);  
        treeCtrl.SetCheck(vecItem\[q\], TRUE);  
        treeCtrl.Expand(vecItem\[q\], TVM\_EXPAND);  
        vecItem.clear();  
        return;  
    }  
    else {  
        //递归,儿子节点当作根节点遍历  
        func(vecItem\[q\], condition);  
    }  
}  

}

构建treeCtrl节点代码

// TODO: 在此添加额外的初始化代码  
CString root\[2\] = { TEXT("A"),TEXT("B") };

for (int i=0;i<2;i++)  
{  
    HTREEITEM r =treeCtrl.InsertItem(root\[i\], NULL);

    CString str;  
    for (int j=0;j<3;j++)  
    {  
        str.Format(TEXT("%s%d"),root\[i\], j + 1);  
        HTREEITEM j1 = treeCtrl.InsertItem(str, r);

        CString str1;  
        for (int m = 0; m < 3; m++) {

            str1.Format(TEXT("%s%d%d"),  root\[i\], j + 1,m+1);  
            HTREEITEM m1 = treeCtrl.InsertItem(str1, j1);

            CString str2;  
            for (int q = 0; q < 3; q++) {

                str2.Format(TEXT("%s%d%d%d"), root\[i\], j + 1, m + 1,q+1);  
                HTREEITEM q1 = treeCtrl.InsertItem(str2, m1);

                CString str3;  
                for (int s = 0; s < 3; s++) {

                    str3.Format(TEXT("%s%d%d%d%d"), root\[i\], j + 1, m + 1, q + 1,s+1);  
                    HTREEITEM s1 = treeCtrl.InsertItem(str3, q1);  
                }  
            }  
        }  
    }  
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章