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

添加线条链接
在树形控件中,有一个属性"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 :按字母顺序插入