目录
树控件在工具箱中的名字是Tree Control
左键拖入界面中,拉宽到相应宽度即可


把Hsa Lines默认的False改为True之后,会显示虚线的引导线

开启前

开启后层次更明晰

而把Has Buttons改为True之后则会增加一个结点按钮


Lines At Root改为True之后则增加了一个根结点之间的引导线,结构是更加明了一些


右键其属性,修改名称为m_tree,访问(作用域)private私有,类别不变,依然是Control控件类型

同样可以在CTreeCtrlDlg::DoDataExchange里找到我们刚创建好的变量,IDC_TREE1是Tree Control的ID名,报红是因为编译器没反应过来,正常情况,不用理睬

在类视图中找到C项目名Dlg后缀问价下可以找到OnInitDialog,在// TODO: 在此添加额外的初始化代码 之后 return TRUE之前写入初始化代码


将在网上下载好的图标,保存到创建好的项目的res(resource资源)文件夹之下,前三张透明背景的图片是在网上找好的,但是要把它们的图片类型统一改成.bmp后缀的位图图片


在资源视图的icon文件夹下导入在res中的icon(右键中,选添加资源而不是插入icon)



选择,导入——把res文件夹点开——把文件类型改为所有文件就可以找到我们的三张bmp文件了——

此时你会发现加载失败,是因为图片太大了,所以呢,需要找占内存更小的位图图片
在bing里搜icon国际版的images页面,可以在filter筛选器中筛选透明背景的图片


用PS创建32*32px像素的画布把想要的图片放进去,然后再保存成bmp格式,PS里创建32*32的画布,打开图层,文件——置入嵌入对象,导入刚刚下载好的图片——把背景图层眼睛关掉——文件存储为(找到BMP格式保存)起个名


比如我起的名字是01,02,03,04

这次导入成功

然而,加载好的图片,不在icon文件夹里,而是在一个加载图片之后新创建出的一个叫Bitmap的文件夹里,出问题了
这主要原因之一是图标格式不对,简简单单的将其他格式图片通过直接改后缀的方式是不行的,例如将.png后缀改为.ico,这样不行
解决方案:通过问题的分析,我们知道要通过正规的渠道获得.ico格式的图标。
方法一:通过专门的.ico格式转换器将自己的.png、.jpg等图片格式转换成.ico格式的图标。此处给一个在线.ico图标转换器的连接:
方法二:直接在网上.ico图标免费资源库中下载。例如“图标宝”:
![]()
![]()
点击下载(save),在新页面点连接,右键图像另存为
![]()

把bmp格式的图片转换成ico格式的图标

导入之后VSicon之后,这次是在icon里了

-
- // TODO: 在此添加额外的初始化代码
- //树控件使用
- //1.设置图标
- //准备HICON图标
- HICON icons[3];
- //icons[0] = AfxGetApp()->LoadIconW(IDB_BITMAP1);//1号位,关于ID的报错都不用管,编译器没反应过来
- //icons[1]= AfxGetApp()->LoadIconW(IDB_BITMAP2);//2号位
- //icons[2] = AfxGetApp()->LoadIconW(IDB_BITMAP3);//3号位
- //第二种
- icons[0]=theApp.LoadIconW(IDI_ICON1);
- icons[1] = theApp.LoadIconW(IDI_ICON2);//2号位
- icons[2] = theApp.LoadIconW(IDI_ICON3);//3号位
- /*CImageList list;*///放到TreeCtrlDlg.h中
- //创建一个放图片的集合
- //首先添加资源,添加32x32的.ioc位图资源
- list.Create(32, 32, ILC_COLOR32, 3, 3);//ILC_COLOR32 32位数色域,32*32是我们的图片像素,3,3表示有三张图片,给三张图片准备空间
- //添加具体的图片,将三个图标加载到图像序列
- for (int i = 0; i < 3; i++)
- {
- list.Add(icons[i]);
- }
- //为树形控件设置图像序列
- m_tree.SetImageList(&list, TVSIL_NORMAL);//正常模式;
如果出现这样的错误,有两个原因,一是没有导入图片,二是写错了图片的ID,系统找不到指定文件的问题,是因为加载图标资源出错,这种问题也会出现在传输MFC文件中,比如在网上下载好了别人的一个有图标的MFC文件,结果发现运行起来出现系统找不到指定文件的错误,就是因为在文件打包压缩过程中icon文件中的资源丢失导致的,要找到文件中使用icon的ID的代码,换成自己的图标导入就可以了

出现以下警告是正常的,而且会重复出现四次

根节点,父节点和子节点,我导入的是三张图片
所以就各一个
- //2.设置节点
- //根节点
- HTREEITEM root= m_tree.InsertItem(TEXT("根节点"), 0, 0, NULL);
- //0表示显示0号位的图片,icons[0],第二个0表示选中之后显示什么,NULL表示没有父节点
- //根节点作为父节点的parent
- //二级节点
- HTREEITEM parent = m_tree.InsertItem(TEXT("父节点"), 1, 1, root);
- //创建一个子节点
- //三级节点
- HTREEITEM sun = m_tree.InsertItem(TEXT("子节点"), 2, 2, parent);//此时parent父节点作为它的父亲
点击运行,如果运行起来没有图片那么看下面一段话
//代码写到这里是没有图片的,是因为CImageList list;我们开辟到了堆区里
//程序运行完就释放了图片集合,导致没有图片显示
//在dlg.h头文件中添加一个pubilic图像列表类对象
//所以要把它写到.h文件中作为成员变量,到了全局区中(变相对它做保存)
//写到与TreeCtrlDlg.cpp(目前操作的这个文件夹)对应的TreeCtrlDlg.h中
//先重新生成解决方案文件,再运行

至此,就可以成功运行了,图标没啥逻辑和审美含量,凑合着看吧

- //设置默认选项的API
- m_tree.SelectItem(sun);//比如默认选中的是子节点
运行结果如下

在类视图中选中Dlg后缀的文件,右键找到属性,闪电图标是事件,有一个关于选择selection的事件,add 事件指定选项从一项变成另一项


在事件函数中添加代码

- void CTreeCtrlDlg::OnTvnSelchangingTree1(NMHDR *pNMHDR, LRESULT *pResult)
- {
- LPNMTREEVIEW pNMTreeView = reinterpret_cast
(pNMHDR); - // TODO: 在此添加控件通知处理程序代码
- *pResult = 0;
- //在进行此事件书写之前
- //我们需要把之前设置的默认选中的sun节点代码注释掉,m_tree.SelectItem(sun);//比如默认选中的是子节点
- //才可以根据我们的跳转进行跟踪显示
- //获取当前项
- HTREEITEM item= m_tree.GetSelectedItem();
- CString name = m_tree.GetItemText(item);
- MessageBox(name);//弹出用户选中的内容
- }
//在进行此事件书写之前
//我们需要把之前设置的默认选中的sun节点代码注释掉,m_tree.SelectItem(sun);//比如默 认选中的是子节点
//才可以根据我们的跳转进行跟踪显示
