【MFC】树控件的使用详解

目录

添加线条链接

添加折叠小按钮

设置树控件的节点和对应的图标

设置默认选中项

设置选中项切换响应函数

涉及接口介绍:


首先我们通过资源视图可以添加一个树形控件,如下:

添加线条链接

在树形控件中,有一个属性"Has Lines",如下图所示(这里因为汉化的原因显示中文):

当 "Has Lines"为true时,子节点与父节点之间会添加线条链接,效果如下:

上面虽然子节点与父节点之间虽然有线条链接,但是可以发现与根节点之间并没有线条链接,这里可以在设置 "Lines At Root"属性如下:

添加折叠小按钮

默认情况下,每个父项节点是没有"+"按钮,进行展开/收起子节点的,这里有一个属性"Has Buttons",如下:

当 "Has Buttons"属性为true时,效果如下:

设置树控件的节点和对应的图标

第一步:准备icon资源,如果原始图片资源不是icon资源,我们可以先通过如下链接,将图片资源转换为icon格式

Convertio --- 文件转换器https://convertio.co/zh/将准备好的icon资源放到项目所在目录下的res目录中

随后,在资源视图中添加资源->icon->导入

第二步:通过代码添加树控件节点和对应的图标

这里需要注意的是CImageList imgeList必须在头文件声明,因为这里是在初始化函数中执行的,当函数结束,对话窗窗口还存在,树控件还指向imgeList中的图标,就会导致访问已经释放的资源问题。

cpp 复制代码
	/*1、加载图片资源*/
    HICON img[3];
	img[0] = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	img[1] = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	img[2] = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	imgeList.Create(30, 30, ILC_COLOR32, 3, 3);
	for (int i = 0; i < 3; ++i) {

		imgeList.Add(img[i]);
	}
	m_tree.SetImageList(&imgeList, TVSIL_NORMAL);
	/*2、设置节点、节点图标、节点的父节点*/
	HTREEITEM root = m_tree.InsertItem(L"根节点", 0, 0, TVI_ROOT);
	HTREEITEM parent = m_tree.InsertItem(L"父节点", 1, 1, root);
	HTREEITEM sub1 = m_tree.InsertItem(L"子节点", 2, 2, parent);

效果如下:

设置默认选中项

cpp 复制代码
	HTREEITEM root = m_tree.InsertItem(L"根节点", 0, 0, TVI_ROOT);
	HTREEITEM parent = m_tree.InsertItem(L"父节点", 1, 1, root);
	HTREEITEM sub1 = m_tree.InsertItem(L"子节点", 2, 2, parent);

    /*设置默认选中项*/
	m_tree.SelectItem(sub1);

效果如下:

设置选中项切换响应函数

在树控件中,选中项切换对应的响应函数是TVN_SELCHANGED,如下:

我们可以在这个函数中编写需要的代码

涉及接口介绍:

1、AfxGetApp()->LoadIcon()

功能:加载应用程序图标资源(已经通过资源文件导入的资源)

语法:

cpp 复制代码
HICON LoadIcon(UINT nIDResource);

参数 :

  • nIDResource :图标资源ID(如 IDR_MAINFRAME )

返回值 :成功返回图标句柄(HICON),失败返回NULL。

说明 :

  • AfxGetApp() 获取当前应用程序对象指针
  • 从应用程序资源中加载指定ID的图标

2、CImageList::Create()

功能:创建图像列表对象

语法:

cpp 复制代码
BOOL Create(
    int cx,           // 图像宽度
    int cy,           // 图像高度
    UINT nFlags,      // 图像类型标志
    int nInitial,     // 初始图像数量
    int nGrow         // 增长数量
);

参数详解 :

-cx :每个图像的宽度(像素)

-cy :每个图像的高度(像素)

-nFlags :图像类型标志,常用值:

  • ILC_COLOR :使用默认行为

  • ILC_COLOR4 :4位(16色)

  • ILC_COLOR8 :8位(256色)

  • ILC_COLOR16 :16位(65536色)

  • ILC_COLOR24 :24位(真彩色)
    - ILC_COLOR32 :32位(真彩色+Alpha通道) //常用

  • ILC_MASK :使用掩码

  • nInitial :图像列表的初始容量

  • nGrow :当需要更多空间时的增长数量

返回值 :成功返回TRUE,失败返回FALSE。

3、CTreeCtrl::SetImageList()

功能:为树控件设置图像列表

语法:

cpp 复制代码
CImageList* SetImageList(
    CImageList* pImageList,  // 图像列表指针
    int nImageListType       // 图像列表类型
);

参数 :

  • pImageList :指向CImageList对象的指针

  • nImageListType :图像列表类型,常用值:
    - TVSIL_NORMAL :正常状态图像列表 //常用

  • TVSIL_STATE :状态图像列表

返回值 :返回之前设置的图像列表指针。

4、CTreeCtrl::InsertItem()

功能:在树控件中插入新节点

语法:

cpp 复制代码
HTREEITEM InsertItem(
    LPCTSTR lpszItem,        // 节点文本
    int nImage,              // 正常状态图像索引
    int nSelectedImage,      // 选中状态图像索引
    HTREEITEM hParent,       // 父节点句柄
    HTREEITEM hInsertAfter   // 插入位置
);

// 简化版本
HTREEITEM InsertItem(
    LPCTSTR lpszItem,        // 节点文本
    HTREEITEM hParent,       // 父节点句柄
    HTREEITEM hInsertAfter   // 插入位置
);

参数详解 :

  • lpszItem :节点显示的文本字符串

  • nImage :节点正常状态时显示的图像索引(对应图像列表中的索引)

  • nSelectedImage :节点被选中时显示的图像索引

  • hParent :父节点句柄,特殊值:

- TVI_ROOT :作为根节点插入

  • 其他HTREEITEM:作为指定节点的子节点

  • hInsertAfter :插入位置,特殊值:

  • TVI_FIRST :插入为第一个子节点

  • TVI_LAST :插入为最后一个子节点

  • TVI_SORT :按字母顺序插入

相关推荐
真的想上岸啊4 分钟前
学习C++、QT---21(QT中QFile库的QFile读取文件、写入文件的讲解)
c++·qt·学习
小庞在加油27 分钟前
Apollo源码架构解析---附C++代码设计示例
开发语言·c++·架构·自动驾驶·apollo
188_djh1 小时前
# 电脑每次重启都自动启动惠普安装程序,怎么取消?
windows·任务管理器·惠普打印机·msconfig·hpsmartinstall·安装程序自动启动·系统配置工具
甜甜不吃芥末1 小时前
Windows 应用程序的 UI 框架:WPF、WinUI 3 和 UWP的差异区别
windows·ui·wpf
专注VB编程开发20年1 小时前
各版本操作系统对.NET支持情况(250707更新)
开发语言·前端·ide·vscode·.net
我喜欢就喜欢1 小时前
RapidFuzz-CPP:高效字符串相似度计算的C++利器
开发语言·c++
千帐灯无此声1 小时前
Linux 测开:日志分析 + 定位 Bug
linux·c语言·c++·bug
莫彩1 小时前
【Modern C++ Part7】_创建对象时使用()和{}的区别
开发语言·c++
星光54221 小时前
飞算JavaAI:给Java开发装上“智能引擎”的超级助手
java·开发语言
June bug2 小时前
【Python基础】变量、运算与内存管理全解析
开发语言·python·职场和发展·测试