【MFC开发(16)】树形控件Tree Control

2023-05-16

1.树形控件的属性配置

(1)Check Boxes :默认为false,如果选择为true的话每个节点前面会带有一个方框

 

(2)Edit Labels:默认为false,如果选择为true的话每个节点的名称可以编辑修改

(3)Has Buttons: 默认为false,如果选择为true的话展开的节点前面会有加号或者减号

 (4)Has Lines:默认为false,如果选择为true的话会出现线如下所示

 

 (5) Lines At Root:默认为false,选择为true的话从根节点就会有线

2.常用函数方法

 (1)给树形控件添加变量

 

 (2)插入节点

//添加节点
	//在树形控件中每一个结点都有一个句柄(HTREEITEM),
	//同时插入结点时必须提供父结点句柄,
	//(其中根Root结点只有一个,既不可以添加也不可以删除)
	//利用HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
	//可以插入一个结点,pszItem为显示的字符,
	//hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。
	hroot = m_Tree.InsertItem(_T("父亲"));
	HTREEITEM hroot_sub1 = m_Tree.InsertItem(_T("儿子1"), hroot);
	HTREEITEM hroot_sub2 = m_Tree.InsertItem(_T("儿子2"), hroot);
	HTREEITEM hroot_sub3 = m_Tree.InsertItem(_T("儿子3"), hroot);
	HTREEITEM hroot_sub1_sub1 = m_Tree.InsertItem(_T("孙子1-1"), hroot_sub1);
	HTREEITEM hroot_sub1_sub2 = m_Tree.InsertItem(_T("孙子1-2"), hroot_sub1);
	HTREEITEM hroot_sub3_sub1 = m_Tree.InsertItem(_T("孙子3-1"), hroot_sub3);
	HTREEITEM hroot_sub3_sub2 = m_Tree.InsertItem(_T("孙子3-2"), hroot_sub3);

(3)获取节点的文本内容

//获得节点的文本内容
	CString hroot_text = m_Tree.GetItemText(hroot);
	MessageBox(hroot_text);

 (4)设置节点的文本内容

	//设置节点的文本内容
	m_Tree.SetItemText(hroot_sub1_sub1, _T("我叫孙子"));

 (5)获得当前选中的节点

//获得选中的节点
	HTREEITEM hselected = m_Tree.GetSelectedItem();
	//获得选中节点上的文本内容
	CString hselected_text = m_Tree.GetItemText(hselected);
	MessageBox(hselected_text);

(6)修改当前选中的节点

//聚焦
	m_Tree.SetFocus();
	//修改选中的节点
	m_Tree.SelectItem(hroot);

(7)删除节点

//删除某个节点,根据句柄来删除
	//如果删除的节点有子节点,也会同时被删除掉
	m_Tree.DeleteItem(hroot_sub3);
	
	//删除所有节点
	m_Tree.DeleteAllItems();

3.遍历树形控件

默认上面的情况都是针对单选,那么Tree树形控件支不支持多选呢?答案是:默认不支持
不过可以通过给节点前面加上 CheckBox 复选框来解决!

新建一个成员函数来写递归函数来遍历树形控件

//树形递归函数
void CMFC_Test1Dlg::EnumTreeItem(HTREEITEM hitem){
	if (!hitem)  return;

	//如果当前节点被勾选
	if (m_Tree.GetCheck(hitem)){

		//获得节点的文本内容
		CString hitem_text = m_Tree.GetItemText(hitem);
		MessageBox(hitem_text);
	}

	//获得子节点
	HTREEITEM hitem_child = NULL;

	if (m_Tree.ItemHasChildren(hitem)){
		//获取子节点
		hitem_child = m_Tree.GetChildItem(hitem);
		//如果继续存在子节点
		do
		{
			//子节点进入递归
			EnumTreeItem(hitem_child);
			//找到子节点的兄弟节点,如果为空则跳出
			hitem_child = m_Tree.GetNextItem(hitem_child, TVGN_NEXT);;
		} while (hitem_child);
	}
}

4.完全展开/合并所有节点

添加代码

添加一个Button控件来控制展开与合并

void CMFC_Test1Dlg::OnBnClickedButton20()
{
	// TODO:  在此添加控件通知处理程序代码
	static UINT opcode = TVE_EXPAND;
	//扩展父节点
	ExpendTreeItem(hroot, opcode);
	//如果是展开的则设置为合并
	opcode = (opcode == TVE_EXPAND) ? TVE_COLLAPSE : TVE_EXPAND;
}

合并展开函数递归实现

void CMFC_Test1Dlg::ExpendTreeItem(HTREEITEM hitem, UINT opcode){
	if (!hitem)  return;
	//进行展开
	m_Tree.Expand(hitem, opcode);
	//如果当前节点存在子节点
	if (m_Tree.ItemHasChildren(hitem)){
		//获得子节点
		HTREEITEM hchild = m_Tree.GetChildItem(hitem);
		while (hchild){
			//扩展或者合并子节点
			ExpendTreeItem(hchild, opcode);
			//子节点完了之后转到相邻节点
			hchild = m_Tree.GetNextItem(hchild,TVGN_NEXT);
		}
	}
}

 
5.如何编辑节点的文本内容以及更改保存

(1)设置树形控件的label可以编辑

(2)添加变量事件

开始编辑事件

 

结束编辑事件

 

 (3)代码完成

//开始编辑标签
void CMFC_Test1Dlg::OnTvnBeginlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
	// TODO:  在此添加控件通知处理程序代码
	//设置只允许输入的字符长度
	m_Tree.GetEditControl()->LimitText(5);
	*pResult = 0;//如果该参数=1,则不能编辑
}


//结束编辑标签
void CMFC_Test1Dlg::OnTvnEndlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
	// TODO:  在此添加控件通知处理程序代码
	//如果节点内容不为空以及长度大于0
	if (pTVDispInfo->item.pszText && _tcslen(pTVDispInfo->item.pszText)>0){
		//设置节点的文本内容
		m_Tree.SetItemText(pTVDispInfo->item.hItem, pTVDispInfo->item.pszText);
	}
	*pResult = 0;
}

6.插入带图标的节点

给每个节点前面可以添加图标,当选中和未选中状态下显示不同的图标

(1)添加资源

将几个ico图标文件添加到工程资源中,ID分别为:IDI_ICON1、IDI_ICON2、IDI_ICON3

导入资源到项目资源钟

 

 (2)添加变量并且完成代码

添加图片资源变量CImageList

//定义图片资源变量
	CImageList m_imglist;

创建图片资源并且和树形控件变量绑定

//创建资源,参数依次为长、宽、标志、初始化几个、增幅
	m_imglist.Create(16,16,ILC_MASK|ILC_COLOR32,2,1);
	//添加资源
	m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
	m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
	m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON3));

	//树形控件与图片资源关联,图标的类型
	m_Tree.SetImageList(&m_imglist,TVSIL_NORMAL);

设置节点的选中和未选中的图标序号

在插入节点的时候就可以设置图标了

	//参数一次为节点的名称,选中时的图标序号,未选中时的图标序号
	hroot = m_Tree.InsertItem(_T("父亲"),0,1);
	HTREEITEM hroot_sub1 = m_Tree.InsertItem(_T("儿子1"),0,1, hroot);
	HTREEITEM hroot_sub2 = m_Tree.InsertItem(_T("儿子2"), 0, 1, hroot);

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MFC开发(16)】树形控件Tree Control 的相关文章

  • B 树和 2-3-4 树之间的区别

    B 树和 2 3 4 树有什么区别 另外 你如何找到每个的最大和最小高度 链接到维基百科 http en wikipedia org wiki 2 3 4 tree and引用 2 3 4 树是 4 阶 B 树 A 2 3 4 is a B
  • 最大函数c树高度

    c 中是否有 max 函数 所以我可以做这样的事情来计算树高 或者也许有更好的方法来计算树高 int height struct node tree if tree NULL return 0 return 1 max height tre
  • 使用树输出预测 Spark 中梯度提升树情况下的类概率

    众所周知 Spark 中的 GBT 目前可以为您提供预测标签 我正在考虑尝试计算一个类的预测概率 假设所有实例都落在某个叶子下 构建 GBT 的代码 import org apache spark SparkContext import o
  • 如何使用 php 列出目录以在文件夹中导航,而不使用 javascript? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找这个 PHP 函数 列出目
  • 当窗口未最大化时缺少 WM_NCLBUTTONUP 消息的奇怪问题

    我有一个处理 WM NCLBUTTONUP 消息的窗口 以便处理标题栏中自定义按钮的点击 当窗口最大化时 这非常有效 但当窗口未最大化时 WM NCLBUTTONUP 消息永远不会到达 不过我确实收到了 WM NCLBUTTONDOWN 消
  • Python 中的树形图

    我想用 Python 绘制树 决策树 组织结构图等 有哪些库可以帮助我完成这些任务 I develop ETE http etetoolkit org which is a python package intended among oth
  • 如何向 CMFCPopupMenu 添加图标?

    我想用CMFCPopupMenu用于右键单击期间的弹出菜单 如何添加图标CMFCPopupMenu 这是我在基本 MFC 应用程序中尝试的示例代码 CMFCPopupMenu TestCMFCPopMenu new CMFCPopupMen
  • 迭代多级提升树

    我的树看起来像这样 Library L ID 1 Book B ID 1 Title Moby Dick Book B ID 2 Title Jurassic Park Library L ID 2 Book B ID 1 Title Ve
  • D3可折叠树不同节点颜色

    我在 d3 js 中有一个可折叠的树 我的目标是通过 类型 属性为节点着色 例如 类型 str 的节点应填充为红色 而类型 elem 的节点应填充为绿色 我就是无法让它发挥作用 有人能帮助我吗 这是我的代码
  • 如何停止对辅助隐式加载 DLL 的 DLL 劫持

    例如 COMDLG32 DLL 隐式链接到以下系统 DLL 以及其他 xmllite dll dll srvcli dll wkscli dll 链接信息库 netutils dll 微星 dll 由于这些是由操作系统隐式加载的 而不是使用
  • 在Linux上运行MFC程序

    我有一个相当大的基于 MFC 的程序 我的任务是让它在 Linux 上运行 我已经解释过 这需要将程序重新编写为带有 STL 的直接 C 更多工作 或者重新编写为 Qt C 更少工作 现在我被告知 我需要编写包装器以使每个 MFC 类在 L
  • 如何使用表达式树安全访问可为空对象的路径?

    当我将反序列化的 XML 结果放入 xsd 生成的对象树中 并希望使用该树 a b c d e f 内的某些深层对象时 如果该查询路径上的任何节点丢失 它将给出异常 if a b c d e f null Console Write ok
  • 想要将 ColeDateTime 转换为 CTime

    我正在从数据库中读取日期时间ColeDateTime格式 我想将其转换为CTime获取日期 月份 年份和时间 CString repDt this will hold the datetime which i read from Datab
  • 提取给定节点的所有父节点

    我正在尝试使用以下命令提取每个给定 GO Id 节点 的所有父级EBI RDF sparql 端点 https www ebi ac uk rdf services sparql 我是根据this https stackoverflow c
  • 二叉树实现C++

    二叉树插入 include stdafx h include
  • 任何人都知道 JQuery 插件可以生成类似于 geni.com 上的树形菜单

    大家好 我花了几个小时寻找一个 Jquery 插件来生成像 geni com 上那样的树形菜单模块 如果有人知道 Jquery 中的这样的插件或脚本 请让我知道或指导我如何使用 Jquery 开发这样的功能 请检查我正在寻找什么http w
  • Webix 树节点的 Font Awesome 图标

    Webix 与 Font Awesome 集成 http docs webix com desktop icon types html 但是如何使用 Font Awesome 图标代替树中的默认文件夹 文件图标来设置各个节点的样式呢 这是我
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 非二叉树的中序树遍历

    对于比二叉树更宽的树 术语 中序遍历 是否有明确定义的含义 或者 前 和 后 顺序是唯一有意义的 DFS 类型吗 我的意思是与n每个节点 gt 2 个子节点 我猜是为了n这甚至可能意味着之后要转到 根 n 2孩子们 但这曾经这样使用过吗 那
  • 具有键唯一性和按位置排序的 MFC 字典集合

    看着表上http msdn microsoft com en us library y1z022s1 28v vs 80 29 aspx core collection shape features http msdn microsoft

随机推荐

  • error while loading shared libraries: libQtGui.so.4: cannot open shared object file:

    qt4编写的界面在mini6410上运行失败 xff0c 总是提示错误 xff1a error while loading shared libraries libQtGui so 4 cannot open shared object f
  • 第十一课:树莓派L298N电机实验

    第一课 什么是树莓派 第二课 基于树莓派的10个经典项目 第三课 购买您的第一个树莓派 第四课 如何安装树莓派系统 第五课 树莓派C语言编程手册 第六课 树莓派led控制 第七课 树莓派按键控制 第八课 树莓派PWM 脉宽调制
  • 从旋转矩阵计算欧拉角

    旋转矩阵和欧拉角之间的正向转换关系比较好推理 xff0c 而逆向变换就显得不是那么容易了 这篇博客介绍由旋转矩阵计算欧拉角的方法 xff0c 参考了一篇Paper xff1a Computing Euler angles from a ro
  • aiohttp 异步http请求-1.快速入门 get 请求示例

    前言 在 python 的众多 http 请求库中 xff0c 大家最熟悉的就是 requests 库了 xff0c requests 库上手非常容易 xff0c 适合入门学习 如果平常工作中对发请求不追求效率和并发的情况下 xff0c r
  • Flask 学习-67.钩子函数before_request 和 before_first_request 的使用

    前言 学过pytest框架的肯定知道什么叫钩子 xff08 hook xff09 函数 钩子函数的作用是在程序运行的过程中插入一段代码做一些事情 四个钩子 请求钩子是通过装饰器的形式实现 xff0c Flask支持如下四种请求钩子 xff1
  • 30岁自学嵌入式找工作,可行吗?前景怎么样?

    大家好 xff0c 我是张巧龙 xff0c 在知乎上看到一个问题 xff1a 30岁自学嵌入式找工作 xff0c 可行吗 xff1f 看看一个高赞回答 xff1a 注 xff1a 以下内容不代表本公众号观点 xff0c 仅供参考 不可行 嵌
  • 0基础在ROS系统中实现RRT算法(四)URDF集成gazebo并搭建gazebo仿真环境

    小白一枚 xff0c 毕设突发奇想加入了ROS的内容 xff0c 不知道自己还能不能毕业 以下均为通过看视频 xff0c 翻博客等整理而成的笔记 xff0c 并非我的原创 可能会出现一些报错的修改或者简单的代码是我自己做的 哈哈 Gazeb
  • 如何在vscode中优雅的编写C语言

    如何在vscode中优雅的编写C语言 各位好 xff0c 我认为vscode编辑器在windows环境下除了Pycharm外是最方便的IDE了 xff0c 但在初学C语言时很少有人的第一个C语言软件使用的是vscode来编译与运行 xff0
  • Unity 使用RVO2(orca)算法

    RVO算法官方下载 https github com snape RVO2 CS git 官方版本的RVO只支持增加移动代理和障碍物 xff0c 不支持删除移动代理和障碍物 不太符合实际应用 我拓展了删除移动代理与障碍物的方法 示例项目 x
  • 51单片机串口通讯UART

    1 串行通信的的基本知识 在实际的工业生产 xff0c 或者生活中 xff0c 计算机的CPU要与外部的设备之间进行信息的交流 xff0c 数据的交换 xff0c 所有的这些信息交换均可称为通信 通信的方式有两种 xff0c 分别为串行通信
  • 库函数开发与寄存器开发

    在以前 8 位机时代的程序开发中 xff0c 一般直接配置芯片的寄存器 xff0c 控制芯片的工作方式 xff0c 如中断 xff0c 定时器等 配置的时候 xff0c 常常要查阅寄存器表 xff0c 看用到哪些配置位 xff0c 为了配置
  • Arduino修改Serial接收缓冲区大小

    看到网上有资料说 xff0c 直接添加以下宏定义就可以了 xff1a span class token macro property span class token directive keyword define span SERIAL
  • RT-Thread nmealib库WH-GN100模块设置仅支持北斗

    RT Thread nmealib库主页 在nmea thread init函数的末尾 xff0c 添加以下代码块 xff0c 发送配置指令 xff0c 仅使用北斗卫星 xff0c 即可配置成仅GPS卫星工作模式 span class to
  • C#中字符串判断为空或者空格

    最近遇到这个问题 xff0c 来大概说一下C 中字符串判断为空或者空格这个问题 xff08 1 xff09 字符串为空null xff0c 怎么讲就是内存中没有放东西 xff0c 比如新创建的字符串就为空null xff0c string
  • 【冷知识】火车票座位分布知识点

    最近到了每年过年 xff0c 春运火车高峰期的时候了 xff0c 有的人想知道自己具体的位置在哪里 xff08 比如硬座是不是靠窗的 xff0c 座位的大小号排序等 xff09 xff0c 现在来讲讲这方面的知识点 xff0c 个人整理 列
  • QT中的自定义信号以及自定义函数

    信号与槽函数是QT的一大创新 xff0c 通过自定义信号与槽函数可以实现自己想实现的功能 标准的信号与槽写法如下 xff1a connect amp button amp QPushButton clicked this amp QWidg
  • 如何摆放PCB元器件?(建议收藏)

    PCB设计 xff0c 既是科学也是艺术 其中有非常多关于布线线宽 布线叠层 原理图等等相关的技术规范 xff0c 但当你涉及到PCB设计中具有艺术特质元器件布局问题时 xff0c 问题就变得有趣起来了 事实上 xff0c 关于元器件摆放限
  • 【MFC开发(6)】复选框按钮控件Check Box

    1 新建复选框 直接拖拽即可 xff0c 设置名字可修改caption内容 2 设置默认选中 复选框可多选 xff0c 所以可以给很多复选框按钮进行选中 xff0c 代码如下所示 xff0c 放在dlg初始化函数中实现 获取多选框香蕉的指针
  • 【MFC开发(15)】进度条控件Progress Control

    1 进度条控件的常用方法 首先给控件添加一个变量 在dlg初始化函数钟进行方法的实现 进度条显示区域 设置进度条的范围 m progress SetRange 0 100 设置进度条当前的位置 m progress SetPos 75 获取
  • 【MFC开发(16)】树形控件Tree Control

    1 树形控件的属性配置 xff08 1 xff09 Check Boxes xff1a 默认为false xff0c 如果选择为true的话每个节点前面会带有一个方框 xff08 2 xff09 Edit Labels xff1a 默认为f