背景

本篇旨在MSDN帮助文档下总结树形控件Tree Control的使用,并列出碰到的具体问题。

正文

树形控件Tree Control的类则是CTreeCtrl,具体成员对象详见链接,以下则描述一些典型应用。

  1. 树形控件的创建

    当然,所有控件均有两种实现方式,一是在对话框模版中直接将控件Tree Control拖入对应的窗口上,另一种则是通过CtreeCtrl内的成员函数Creat(..)来创建。本文章不想过于繁琐,因此只记录前者。当然也可以根据Creat(...)函数的参数来创建,详见第三部分的关于鸡啄米博客的参考链接。

    为了能对添加的树形控件进行操作,因此需要在对应的属性控件添加变量——在对应的窗口的树形控件右击选择添加变量,取一个变量名,此处为m_DevlistTree,至此则由VS自动创建了该控件的控制变量m_DevlistTree

  2. 在树形控件上添加元素

    调用函数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
// 传入对应的值既可以使对应的元素图标覆盖为对应的图标。
  1. 将树形控件折叠或者展开:

    调用函数Expand(..)可实现,函数如下:
BOOL Expand(
HTREEITEM hItem,
UINT nCode );
/*
hItem: 要操作的Item
nCode: 要执行的操作:
*TVE_COLLAPSE:折叠
*TVE_COLLAPSERESET:折叠并移除所有的该节点下的子节点,必须配合TVE_COLLAPSE使用
*TVE_EXPAND 展开元素
*TVE_TOGGLE 当前为折叠则展开,当前为展开则折叠。
*/
  1. 获取树形控件的焦点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

Visual studio C++ MFC之树形控件Tree Control的更多相关文章

  1. Visual studio C++ MFC之列表控件CListCtrl Control

    背景 本篇旨在MSDN帮助文档下总结列表控件CListCtrl Control的使用,并列出碰到的具体问题. 正文 列表型控件List Control的类是ClistCtrl,具体成员对象详见链接,以 ...

  2. VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)

    前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例. 树形控件的创建 MFC为树形控件提 ...

  3. VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)

    前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...

  4. VS2010-MFC(常用控件:树形控件Tree Control 下)

    转自:http://www.jizhuomi.com/software/203.html 前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件 ...

  5. VS2010-MFC(常用控件:树形控件Tree Control 上)

    转自:http://www.jizhuomi.com/software/200.html 前面两节讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Contr ...

  6. ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID

    使用element-ui  tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys 后,发现只能返回子节点的ID,但是其父节点ID没有返回. 解决办法有三种: 1.element ...

  7. 关于elment-ui树形控件Tree的使用

    如果简单使用的tree树形控件,按照Element ui Tree 树形控件 官方文档使用即可,基本上能够完成大部分的需求. 但是如果需要对树形结构进行额外操作,仅仅根据官方文档提供的方案的话,可能就 ...

  8. (八)树控件(Tree Control),标签控件(tab control)

    树控件 基于对话框创建工程 // 01_TreeCtrlDlg.cpp : 实现文件 // #include "stdafx.h" #include "01_TreeCt ...

  9. 解决Visual Studio 找不到报表控件、rdlc中文乱码

    找回报表控件 运行安装程序中的 ..\packages\Reporting Services\RVAddon.msi 工具栏,右键选择ReportViewer,注意选择的版本 如果不能编辑报表文件(. ...

随机推荐

  1. deepin使用root身份运行

    https://blog.csdn.net/guanripeng/article/details/79630619

  2. 可折叠的listview 之ExpandableListView基本使用

    先看效果 demo实现 其他的方法和ListView的方法一样,下面来看看具体demo的实现 首先布局文件很简单,就一个控件为: <?xml version="1.0" en ...

  3. IE webkit 滚动条样式!

    <style type="text/css"> // IE 模式 *{ scrollbar-face-color:#F3F3F3; /*面子*/ scrollbar-a ...

  4. owasp zap 安全审计工具 功能详解

    一.persist session 该功能主要保存扫描分析的结果,方便下次继续分析 二.扫描策略 1.修改策略 A.入口 B.具体设置页面 C.设置完成后,发起主动扫描,在弹出的窗口可以选择策略 D. ...

  5. Python与数据结构[4] -> 散列表[0] -> 散列表与散列函数的 Python 实现

    散列表 / Hash Table 散列表与散列函数 散列表是一种将关键字映射到特定数组位置的一种数据结构,而将关键字映射到0至TableSize-1过程的函数,即为散列函数. Hash Table: ...

  6. Annotation的语法和使用

    http://blog.csdn.net/cdl2008sky/article/details/6265742 (1) .<context:component-scan base-package ...

  7. 【bzoj2142】【礼物】拓展Lucas定理+孙子定理

    (上不了p站我要死了,侵权度娘背锅) Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量 ...

  8. Java高级架构师(一)第02节:分模块、分工程管理

    本节课程的目标在于:利用Maven构建分工程.分模块的空项目. -------- 基本的构建大致相同,有一个强调调点: 在总web的pom里边(architecture01web中),加入要合并的wa ...

  9. 请用心练完这16个webpack小例子

    16个demo,webpack+react搭配使用首先教大家2个新技能 1.按照正常github地址情况下,你的github本身不能访问目录. 例如要访问vue-demo下的vueCpu文件夹:htt ...

  10. 如何订阅Linux相关的邮件列表

    转:http://blog.163.com/sunshine_linting/blog/static/44893323201282114012845/ 1.google"linux kern ...