当前位置:网站首页>【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); 
边栏推荐
- 我想知道手机注册股票开户的流程?另外,手机开户安全么?
- 【C】 Summary of wrong questions in winter vacation
- 1.jetson与摄像头的对接
- Foundation: 2 The essence of image
- shardingSphere
- Pipeline detection of UAV Based on gazebo
- CPU設計實戰-第四章實踐任務一簡單CPU參考設計調試
- Manually dig XSS vulnerabilities
- factory type_ Id:: create process resolution
- 《单片机原理及应用》—定时器、串行通信和中断系统
猜你喜欢

CPU設計實戰-第四章實踐任務一簡單CPU參考設計調試

1.jetson与摄像头的对接
![Thread safety analysis of [concurrent programming JUC] variables](/img/f9/a3604bec6f7e5317dd2c578da73018.jpg)
Thread safety analysis of [concurrent programming JUC] variables

明明设计的是高带宽,差点加工成开路?

截图小妙招

"Analysis of 43 cases of MATLAB neural network": Chapter 30 design of combined classifier based on random forest idea - breast cancer diagnosis

Maneuvering target tracking -- current statistical model (CS model) extended Kalman filter / unscented Kalman filter matlab implementation

避免按钮重复点击的小工具bimianchongfu.queren()

5mo3 UHI HII HII 17mn4 19Mn6 executive standard

01 numpy introduction
随机推荐
Do you know how data is stored? (C integer and floating point)
Introduction to R language
leetcode T31:下一排列
[JS reverse] MD5 encryption parameter cracking
TypeError: __ init__ () got an unexpected keyword argument ‘autocompletion‘
Serial port to WiFi module communication
Centos7 shell脚本一键安装jdk、mongo、kafka、ftp、postgresql、postgis、pgrouting
The meaning of yolov5 training visualization index
Principle and application of single chip microcomputer - principle of parallel IO port
To prevent "activation" photos from being muddled through, databao "live detection + face recognition" makes face brushing safer
Codeworks round 803 (Div. 2) VP supplement
基础:2.图像的本质
Conception et mise en service du processeur - chapitre 4 tâches pratiques
华为机试真题专栏订阅指引
Leetcode T29: 两数相除
基于Gazebo的无人机管道检测
Download jackson codehaus. org jar - downloading jackson. codehaus. org jar
Manually dig XSS vulnerabilities
Qt的模型与视图
Provincial election + noi part I dynamic planning DP