当前位置:网站首页>【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);
边栏推荐
- CPU design practice - Chapter 4 practical tasks - simple CPU reference design and debugging
- Advanced API
- 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
- Download jackson codehaus. org jar - downloading jackson. codehaus. org jar
- Glitch Free时钟切换技术
- 分享2022上半年我读过的7本书
- Centos7 shell script one click installation of JDK, Mongo, Kafka, FTP, PostgreSQL, PostGIS, pgrouting
- 1.jetson与摄像头的对接
- "Analysis of 43 cases of MATLAB neural network": Chapter 30 design of combined classifier based on random forest idea - breast cancer diagnosis
- Intelligent water and fertilizer integrated control system
猜你喜欢
截图小妙招
Centos7 shell script one click installation of JDK, Mongo, Kafka, FTP, PostgreSQL, PostGIS, pgrouting
The use of word in graduation thesis
SPL Introduction (I)
Share 7 books I read in the first half of 2022
Field agricultural irrigation system
C basic knowledge review (Part 4 of 4)
R语言入门
What is the material of 15CrMoR, mechanical properties and chemical analysis of 15CrMoR
Do you know how data is stored? (C integer and floating point)
随机推荐
C basic knowledge review (Part 4 of 4)
TypeError: __ init__ () got an unexpected keyword argument ‘autocompletion‘
Centos7 shell脚本一键安装jdk、mongo、kafka、ftp、postgresql、postgis、pgrouting
Intelligent water and fertilizer integrated control system
Centos7 shell script one click installation of JDK, Mongo, Kafka, FTP, PostgreSQL, PostGIS, pgrouting
Provincial election + noi Part III tree problems
Matlab tips (16) consistency verification of matrix eigenvector eigenvalue solution -- analytic hierarchy process
Model and view of QT
R语言入门
The data analyst will be ruined without project experience. These 8 project resources will not be taken away
3、Modbus通讯协议详解
基于Gazebo的无人机管道检测
Leetcode T34: 在排序数组中查找元素的第一个和最后一个位置
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
In depth learning training sample amplification and tag name modification
Internet of things technology is widely used to promote intelligent water automation management
2022.2.15
一文纵览主流 NFT 市场平台版税、服务费设计
SPL installation and basic use (II)
Leetcode T40: 组合总和II