背景

本篇旨在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. (转帖)关于easyui中的datagrid在加载数据时候报错:无法获取属性"Length"的值,对象为null或未定义

    结贴说明: 很感谢sp1234等人的热心帮忙和提醒,现在我主要说明下问题所在: 首先我在独立的js文件中,直接把测试数据loaddata进去datagrid是没有问题的.var kk = {" ...

  2. thinkphp实现功能:验证码

    1.定义验证码函数 public function verify(){ /** * 在thinkPHP中如何实现验证码 * * ThinkPHP已经为我们提供了图像处理的类库ThinkPHP\Exte ...

  3. (3)python 列表和元组

    列表 元组 字段 等都是一种数据结构.其中列表和元组比较相似都是顺序保存的,都可以通过索引来找到元素. 列表和元组的主要区别:列表是可以修改的,元组不可以修改.列表用[]表示,元组用()表示 一.列表 ...

  4. apache httpd反向代理配置

    apache httpd 2.4.6反向代理的配置,用户访问A server的8080端口,后台会自动请求Bserver的一个端口. 例如,用户访问ip-172-31-28-175的8080端口,后台 ...

  5. MongoError: topology was destroyed解决方法

    MongoError: topology was destroyed 分析得出,出现这个问题是因为,当mongodb尝试写入某个数据的时候,连接被中断了! 解决方法:检查代码中是否存在操作数据的过程中 ...

  6. python操作mysql封装成类

    import pymysqlimport loggingimport sys # 加入日志#获取logger实例logger = logging.getLogger("baseSpider& ...

  7. Problem E: 零起点学算法25——判断是否直角三角形

    #include<stdio.h> int main() { int a,b,c; while(scanf("%d %d %d",&a,&b,& ...

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

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

  9. ORA-12537:TNS连接已关闭

      安装完11i的VIS版本后,客户端连接数据时会报“ORA-12537:TNS连接已关闭”,在网上找到以下解决办法: 今天在远程客户端配置EBS数据库连接的时候发生“ORA-12537:TNS连接已 ...

  10. 解决小米手机Android Studio安装app 报错的问题It is possible that this issue is resolved by uninstalling an existi

    问题描述 Android Studio升级到2.3版本之后,小米手机MIUI8不能运行Android Studio程序,报如下错误: Installation failed with message  ...