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

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);
}
}
}
}
}

MFC之TreeCtrl遍历所有节点的更多相关文章

  1. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

  2. Java 用自带dom解析器遍历叶子节点内容

    一.XML文件config.xml,内容如下: <?xml version="1.0" encoding="UTF-8" standalone=" ...

  3. childNodes遍历DOM节点树

    childNodes遍历DOM节点树 var s = ""; function travel(space,node) { if(node.tagName){ s += space ...

  4. 遍历树节点(多层)的方法(java)

    前序遍历,后序遍历,广度遍历,深度遍历,遍历一级节点.以及按钮如何响应点击事件. import java.awt.*; import java.awt.event.*; import java.uti ...

  5. 5月25日-js操作DOM遍历子节点

    一.遍历节点 遍历子节点 children();//获取节点的所有直接子类 遍历同辈节点 next(); prev(); siblings();//所有同辈元素 *find(); 从后代元素中查找匹配 ...

  6. 详解SimpleXML添加_修改_删除_遍历XML节点属性

    SimpleXML概述 要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制,对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构造为一棵DOM ...

  7. MFC之TreeCtrl控件使用经验总结

    树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点.MFC中使用CTreeCtrl类来封装树形控件的各种操作.通过调用BOOL ...

  8. 递归遍历XML节点属性和属性值

    public static XmlDocument FileMergedIntoXML(string strXmlPathPublic) { string strXmlPathPublic = str ...

  9. VC/MFC 下 递归遍历目录下的所有子目录及文件

    在MFC下要实现文件夹的递归遍历,可用CFileFind类,依次读取文件夹下的子文件夹和文件,并判断通过判断是文件夹还是文件来决定递归遍历.递归遍历代码如下: /******************* ...

随机推荐

  1. 使用增量备份修复DG中的GAP

    问题描述 oracle中DG出现主备不同步现象,alert日志报警有gap信息,但是v$archive_gap视图查不到任何信息.同时主库上的对应归档已经删除且没有备份 解决方案 1.查询备库的scn ...

  2. python虚拟环境安装使用

    # 安装 pip install virtualenv pip install virtualenvwrapper-win # win环境下 liunx下不需要-win #创建一个文件夹并cd进去mk ...

  3. Elasticsearch构建全文搜索系统

    目录 前言 一.安装 1.安装elasticsearch 2.启动集群cluster 3.安装管理界面elasticsearch-head 4.安装分词插件elasticsearch-analysis ...

  4. ApplicationContextInitializer的理解和使用

    一.ApplicationContextInitializer 介绍 1.1 作用 ApplicationContextInitializer 接口用于在 Spring 容器刷新之前执行的一个回调函数 ...

  5. mongo复制数据库和表

    1.使用工具Studio 3T for MongoDB 选择一个数据库中的Collections集合,然后按住 Ctrl+C 复制快捷键会弹出如下帮助框. 点击 Ctrl+V 粘贴快捷键,重命名一下复 ...

  6. Core + Vue 后台管理基础框架4——前端授权

    1.前言 上篇,我们讲了后端的授权.与后端不同,前端主要是通过功能入口如菜单.按钮的显隐来控制授权的.具体来讲,就是根据指定用户的制定权限来加载对应侧边栏菜单和页面内的功能按钮.我们一个个来讲. 2. ...

  7. C++之 ostream详细用法

    前言 在 C++中,ostream表示输出流,英文”output stream“的简称.在 C++中常见的输出流对象就是标准输出流cout,很少自定义ostream的对象,更多的是直接使用cout.那 ...

  8. Flutter配置环境报错“PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target”

    背景:最近看了很多Flutter漂亮的项目,想要尝试一下.所有环境都搭建好之后,按照文档一步一步配置(抄袭),但始终报如下图错误. PKIX path building failed: sun.sec ...

  9. ArchLinux - 脚本安装使用指南

    前面不想废话,讲什么脚本说明,功能什么的!只讲使用方法,其他的可以去Gitee看,去Github看. 脚本虽然支持Boot和UEFI,但是我打算一起讲,因为它们安装时的区别,只有3处不同. 第一步 先 ...

  10. 内置函数---filter和map

    filter filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回 ...