背景
本篇旨在MSDN帮助文档下总结树形控件Tree Control的使用,并列出碰到的具体问题。
正文
树形控件Tree Control的类则是CTreeCtrl,具体成员对象详见链接,以下则描述一些典型应用。
树形控件的创建
当然,所有控件均有两种实现方式,一是在对话框模版中直接将控件Tree Control
拖入对应的窗口上,另一种则是通过CtreeCtrl
内的成员函数Creat(..)来创建。本文章不想过于繁琐,因此只记录前者。当然也可以根据Creat(...)
函数的参数来创建,详见第三部分的关于鸡啄米博客
的参考链接。
为了能对添加的树形控件进行操作,因此需要在对应的属性控件添加变量——在对应的窗口的树形控件右击选择添加变量
,取一个变量名,此处为m_DevlistTree
,至此则由VS自动创建了该控件的控制变量m_DevlistTree
。- 在树形控件上添加元素
调用函数CTreeCtrl::InsertItem(...),此函数有如下几个函数原型;
HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct);
此函数根据结构体LPTVINSERTSTRUCT来添加属性控件元素,结构体如下:
typedef struct { //插入对应节点下,为TVI_ROOT value 或者 NULL则表示插入的在根节点下。 HTREEITEM hParent; /*定义按照何种顺序插入属性控件。 TVI_FIRST:在节点下最开头插入元素 TVI_LAST:在节点下最末尾插入元素(当节点下元素特别多的情况下,使用该属性,在添加过程中会导致整个APP卡在此处,直至添加完毕。) TVI_ROOT:在根节点插入元素 TVI_SORT:按照元素的首字母来排序插入元素 */ HTREEITEM hInsertAfter; /* 该Item结构体描述了插入的元素的属性。 */ TVITEM item; #endif } TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
按照Item结构体元素定义的属性来插入元素,如下:
// 本次未使用该函数,待使用的时候再来做详细解释。 HTREEITEM InsertItem( UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, HTREEITEM hParent, HTREEITEM hInsertAfter);
以下函数很好理解,在根节点的尾部插入文本地址为lpszItem
的元素:
HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
这个函数,则同样是在根节点的尾部插入文本地址为lpseItem
的元素,不同的是,指定了元素图片索引以及元素被选中后的图片索引。
HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
图片的索引操作如下:
// 图标句柄数组 HICON hIcon[3]; // 加载三个图标,并将它们的句柄保存到数组 // 此三个图标为加载进的ICON资源文件 hIcon[0] = theApp.LoadIcon(IDI_ICON0); hIcon[1] = theApp.LoadIcon(IDI_ICON1); hIcon[2] = theApp.LoadIcon(IDI_ICON2); // 创建图像序列CImageList对象 m_imageList.Create(32, 32, ILC_COLOR32, 3, 3); // 将三个图标添加到图像序列 for (int i=0; i<3; i++) { m_imageList.Add(hIcon[i]); } // 为树形控件设置图像序列 m_webTree.SetImageList(&m_imageList, TVSIL_NORMAL); // 至此,0代表IDI_ICON0 1代表IDI_ICON1 2代表IDI_ICON2 // 传入对应的值既可以使对应的元素图标覆盖为对应的图标。
- 将树形控件折叠或者展开:
调用函数Expand(..)可实现,函数如下:
BOOL Expand( HTREEITEM hItem, UINT nCode ); /* hItem: 要操作的Item nCode: 要执行的操作: *TVE_COLLAPSE:折叠 *TVE_COLLAPSERESET:折叠并移除所有的该节点下的子节点,必须配合TVE_COLLAPSE使用 *TVE_EXPAND 展开元素 *TVE_TOGGLE 当前为折叠则展开,当前为展开则折叠。 */
- 获取树形控件的焦点Item
在树形控件右击选择添加事件处理程序
,消息类型选择TVN_SELCHANGED
,类列表的类选择对应窗口的类,本初的类为CMenueditortestDlg
,最后点击添加编辑,生成的代码如下:
void CMenueditortestDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); *pResult = 0; // TODO: 在此添加控件通知处理程序代码 *pResult = 0; HTREEITEM hItem = m_DevlistTree.GetSelectedItem(); // 获取点击的焦点Item m_DevlistTree.Expand(hItem, TVE_EXPAND); // 将焦点Item展开 }
以上事件如宏TVN_SELCHANGED
(select changed)所描述的一样,当焦点由一个Item换为另外一个Item时,就会进入该处理函数,此处函数内执行的代码的效果既是,鼠标单击到某个Item,对应的Item会被展开。
参考链接
MSDN关于CTreeCtrl的帮助文档。;
鸡啄米的博客VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)详细叙述了该控件的使用。
至此记录完毕。
记录时间:2017-2-15
记录地点:深圳WZ
来源:https://www.cnblogs.com/ChYQ/p/6401519.html