当前位置:网站首页>【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); 
边栏推荐
- What is the material of 16mo3 steel plate? What is the difference between 16mo3 and Q345R?
- Yolov3, 4, 5 and 6 Summary of target detection
- 19Mn6 German standard pressure vessel steel plate 19Mn6 Wugang fixed binding 19Mn6 chemical composition
- Leetcode T40: 组合总和II
- Intelligent water supply system solution
- factory type_ Id:: create process resolution
- Huawei machine test questions column subscription Guide
- 15Mo3 German standard steel plate 15Mo3 chemical composition 15Mo3 mechanical property analysis of Wuyang Steel Works
- 为什么LTD独立站就是Web3.0网站!
- 《微机原理》—总线及其形成
猜你喜欢

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

截图小妙招

Introduction to 18mnmo4-5 steel plate executive standard and delivery status of 18mnmo4-5 steel plate, European standard steel plate 18mnmo4-5 fixed rolling

SPL-安装与基本使用(二)

C语言指针的进阶(上篇)

Share 7 books I read in the first half of 2022

"Analysis of 43 cases of MATLAB neural network": Chapter 30 design of combined classifier based on random forest idea - breast cancer diagnosis
![Matlab [functions and images]](/img/8a/d2f68b5a7ed396ad20234c0aa24953.jpg)
Matlab [functions and images]

Principle and application of single chip microcomputer - principle of parallel IO port

TypeError: __init__() got an unexpected keyword argument ‘autocompletion‘
随机推荐
[untitled]
MATLAB【函数求导】
串口转WIFI模块通信
[Yu Yue education] Shandong Vocational College talking about railway reference materials
Conception et mise en service du processeur - chapitre 4 tâches pratiques
《单片机原理与应用》——并行IO口原理
Yolov5 advanced six target tracking environment construction
Audio audiorecord create (I)
Only in China! Alicloud container service enters the Forrester leader quadrant
Matlab tips (16) consistency verification of matrix eigenvector eigenvalue solution -- analytic hierarchy process
CPU設計實戰-第四章實踐任務一簡單CPU參考設計調試
Field agricultural irrigation system
Principle and application of single chip microcomputer - principle of parallel IO port
Leetcode T29: 两数相除
View drawing process analysis
Manually dig XSS vulnerabilities
性能提升2-3倍!百度智能云第二代昆仑芯服务器上线
Gateway-88
Provincial election + noi part I dynamic planning DP
基于Gazebo的无人机管道检测