当前位置:网站首页>【MFC开发(16)】树形控件Tree Control
【MFC开发(16)】树形控件Tree Control
2022-07-01 08:33:00 【Demo.demo】


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); 
边栏推荐
- 2022 examination summary of quality controller civil engineering direction post skills (quality controller) and reexamination examination of quality controller civil engineering direction post skills
- Internet of things technology is widely used to promote intelligent water automation management
- What is the material of 16MnDR, the minimum service temperature of 16MnDR, and the chemical composition of 16MnDR
- CPU設計實戰-第四章實踐任務一簡單CPU參考設計調試
- 《微机原理》-绪论
- 《微机原理》——微处理器内部及外部结构
- Only in China! Alicloud container service enters the Forrester leader quadrant
- 機動目標跟踪——當前統計模型(CS模型)擴展卡爾曼濾波/無迹卡爾曼濾波 matlab實現
- V79.01 Hongmeng kernel source code analysis (user mode locking) | how to use the fast lock futex (Part 1) | hundreds of blogs analyze the openharmony source code
- 《微机原理》—总线及其形成
猜你喜欢

Field agricultural irrigation system

The use of word in graduation thesis

Guidelines and principles of did

MATLAB小技巧(16)矩阵特征向量特征值求解一致性验证--层次分析

【js逆向】md5加密参数破解

C basic knowledge review (Part 4 of 4)

Properties of 15MnNiNbDR low temperature vessel steel, Wugang 15MnNiDR and 15MnNiNbDR steel plates

Conception et mise en service du processeur - chapitre 4 tâches pratiques

What is the material of 16mo3 steel plate? What is the difference between 16mo3 and Q345R?

Qt的模型与视图
随机推荐
Yolov5 advanced six target tracking environment construction
yolov5训练可视化指标的含义
Codeworks round 803 (Div. 2) VP supplement
SPL-介绍(一)
Vscode customize the color of each area
Foundation: 2 The essence of image
Comprehensive experiment Li
Leetcode T40: 组合总和II
Leetcode t31: next spread
IT 技术电子书 收藏
19Mn6 German standard pressure vessel steel plate 19Mn6 Wugang fixed binding 19Mn6 chemical composition
NFT监管要点和海外政策
1.jetson与摄像头的对接
5mo3 UHI HII HII 17mn4 19Mn6 executive standard
Introduction to 18mnmo4-5 steel plate executive standard and delivery status of 18mnmo4-5 steel plate, European standard steel plate 18mnmo4-5 fixed rolling
[detailed explanation of Huawei machine test] judgment string subsequence [2022 Q1 Q2 | 200 points]
機動目標跟踪——當前統計模型(CS模型)擴展卡爾曼濾波/無迹卡爾曼濾波 matlab實現
Yolov5进阶之六目标追踪环境搭建
R语言入门
vscode自定义各个区域的颜色