【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 :按字母顺序插入

相关推荐
伊成6 分钟前
Java面试高频面试题【2025最新版】
java·开发语言·面试
~贝母~22 分钟前
猿人学js逆向比赛第一届第九题
开发语言·javascript·爬虫·ecmascript
编程乐趣1 小时前
推荐一个基于C#开发的跨平台构建自动化系统!
开发语言·c#·自动化
程序员的世界你不懂1 小时前
Windows下allure与jenkins的集成
windows·servlet·jenkins
好奇的菜鸟2 小时前
如何重新安装 Rust
开发语言·后端·rust
方博士AI机器人2 小时前
GNU Octave 基础教程(4):变量与数据类型详解(二)
windows·ubuntu·数据分析·octave
mzhan0172 小时前
Python: file: encode: ‘gbk‘ codec can‘t encode character ‘\xe5‘ in position
开发语言·python
上课耽误学习2 小时前
一生一芯 PA2 RTFSC
开发语言·一生一芯
Smartdaili China2 小时前
使用 Python 抓取亚马逊产品数据: 分步指南
开发语言·爬虫·python·网络爬虫·亚马逊·抓取·爬取
尤物程序猿2 小时前
BufferPool 缓冲池类的理解,手写一个BufferPool 缓冲池
java·开发语言·python