VS2010-MFC(常用控件:树形控件Tree Control 上)
转自:http://www.jizhuomi.com/software/200.html
前面两节讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control。
树形控件简介
树形控件在Windows系统中是很常见的,例如资源管理器左侧的窗口中就有用来显示目录的树形视图。树形视图中以分层结构显示数据,每层的缩进不同,层次越低缩进越多。树形控件的节点一般都由标签和图标两部分组成,图标用来抽象的描述数据,能够使树形控件的层次关系更加清晰。
树形控件在插入新的树节点时会稍麻烦些,回顾之前的列表框,插入新列表项时调用AddString成员函数就可以了,而对于树形控件则需要指定新节点与已有节点的关系。另外,树形控件与列表视图控件一样,可以在每一个节点的左边加入图标。这些都使得树形控件给人一种复杂的感觉,但我们在使用它一两次后会发现其实树形控件用起来还是很方便的。
树形控件的通知消息
下面列出树形控件特有的通知消息中比较常用的几个:
TVN_SELCHANGING和TVN_SELCHANGED:在用户改变了对树节点的选择时,控件会发送这两个消息。消息会附带一个指向NMTREEVIEW结构的指针,程序可从该结构中获得必要的信息。两个消息都会在该结构的itemOld成员中包含原来的选择项信息,在itemNew成员中包含新选择项的信息,在action成员中表明是用户的什么行为触发了该通知消息(若是TVC_BYKEYBOARD则表明是键盘,若是TVC_BYMOUSE则表明是鼠标,若是TVC_UNKNOWN则表示未知)。两个消息的不同之处在于,如果TVN_SELCHANGING的消息处理函数返回TRUE,那么就阻止选择的改变,如果返回FALSE,则允许改变。
TVN_KEYDOWN:该消息表明了一个键盘事件。消息会附带一个指向NMTVKEYDOWN结构的指针,通过该结构程序可以获得按键的信息。
TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT:分别在用户开始编辑和结束编辑节点的标签时发送。消息会附带一个指向NMTVDISPINFO结构的指针,程序可从该结构中获得必要的信息。在前者的消息处理函数中,可以调用GetEditControl()成员函数返回一个指向用于编辑标题的编辑框的指针。如果处理函数返回FALSE,则允许编辑,如果返回TRUE,则禁止编辑。在后者的消息处理函数中,NMTVDISPINFO结构中的item.pszText指向编辑后的新标题,如果pszText为NULL,那么说明用户放弃了编辑,否则,程序应负责更新节点的标签,这可以由SetItem()或SetItemText()函数来完成。
树形控件的相关数据结构
1. HTREEITEM句柄
树形控件中的每个节点都可以由一个HTREEITEM类型的句柄表示。我们通过CTreeCtrl类的成员函数对树进行访问和操作时,很多时候都要用到HTREEITEM句柄。
2. TVITEM结构体
TVITEM结构体描述了树形控件节点的属性,定义如下:
typedef struct tagTVITEM {
UINT mask; // 包含一些掩码位(下面的括号中列出)的组合,用来表明结构的哪些成员是有效的
HTREEITEM hItem; // 树节点的句柄(TVIF_HANDLE)
UINT state; // 树节点的状态(TVIF_STATE)
UINT stateMask; // 状态的掩码组合(TVIF_STATE)
LPTSTR pszText; // 树节点的标签文本(TVIF_TEXT)
int cchTextMax; // 标签文本缓冲区的大小(TVIF_TEXT)
int iImage; // 树节点的图像索引(TVIF_IMAGE)
int iSelectedImage; // 选中项的图像索引(TVIF_SELECTEDIMAGE)
int cChildren; // 表明节点是否有子节点,为1则有,为0则没有(TVIF_CHILDREN)
LPARAM lParam; // 一个32 位的附加数据(TVIF_PARAM)
} TVITEM, *LPTVITEM;
此结构体中多个元素涉及到了图像和状态等,有必要具体解释下。
树形控件节点需要显示图标时,就要为树形控件关联一个图像序列,上面的iImage成员就代表了该结构体对应的树节点的图标在图像序列中的索引,iSelectedImage则代表该树节点被选中时显示的图标在图像序列中的索引。对于如何为树形控件关联图像序列,鸡啄米将在后面的实例中讲到。
stateMask用来说明要获取或设置树节点的哪些状态。下面是state和stateMask的一些常用值及含义:
state 对应的stateMask 含义
TVIS_CUT TVIS_CUT 节点被选择用来进行剪切和粘贴操作
TVIS_DROPHILITED TVIS_DROPHILITED 节点成为拖动操作的目标
TVIS_EXPANDED TVIS_EXPANDED 节点的子节点被展开
TVIS_EXPANDEDONCE TVIS_EXPANDEDONCE 节点的子节点曾经被展开过
TVIS_SELECTED TVIS_SELECTED 节点被选中
lParam在实际开发中常用来存放与树节点有关的附加数据。
3. NMTREEVIEW结构体
NMTREEVIEW结构体中包含了树形控件通知消息的相关信息。树形控件的大多数通知消息都会带有指向该结构体的指针。NMTREEVIEW结构体的定义如下:
typedef struct tagNMTREEVIEW {
NMHDR hdr; // 标准的NMHDR结构
UINT action; // 表明是用户的什么行为触发了该通知消息
TVITEM itemOld; // 原节点的属性
TVITEM itemNew; // 新节点的属性
POINT ptDrag; // 事件发生时鼠标的客户区坐标
} NMTREEVIEW, *LPNMTREEVIEW;
4. TVINSERTSTRUCT结构体
向树形控件中插入新节点时需要用到TVINSERTSTRUCT结构体,它常与TVM_INSERTITEM消息一起使用。定义如下:
typedef struct tagTVINSERTSTRUCT {
HTREEITEM hParent; // 父节点的句柄
HTREEITEM hInsertAfter; // 指明插入到同层中哪一项的后面
#if (_WIN32_IE >= 0x0400)
union
{
TVITEMEX itemex;
TVITEM item;
} DUMMYUNIONNAME;
#else
TVITEM item; // 要添加的新节点的属性
#endif
} TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
若hParent成员为TVI_ROOT或NULL,那么新节点将被作为树的根节点插入。hInsertAfter除了可以是某个节点的句柄,还可以有四种取值:TVI_FIRST(插入到树形控件的最前面)、TVI_LAST(插入到树形控件的最后面)、TVI_ROOT(作为根节点插入)和TVI_SORT(按字母顺序插入)。
5. NMTVDISPINFO结构体
NMTVDISPINFO结构体中包含了与树节点的显示有关的信息。定义如下:
typedef struct tagNMTVDISPINFO
{
NMHDR hdr;
TVITEM item; } NMTVDISPINFO, *LPNMTVDISPINFO;
关于树形控件的使用本节先讲这么多,在下节将继续讲解CTreeCtrl类的相关知识和实例。
VS2010-MFC(常用控件:树形控件Tree Control 上)的更多相关文章
- VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)
前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...
- VS2010 MFC中 Date Time Picker控件的使用
1. 在工具箱中找到Date Time Picker控件,然后拖放到对话框上. 2. 在其属性中按自己的需求做一些设置. Format 属性:Long Date (长日期):****年**月**日 S ...
- VS2010/MFC常用控件:图片控件Picture Control
图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到 ...
- VS2010/MFC对话框四:为控件添加消息处理函数
为控件添加消息处理函数 创建对话框类和添加控件变量在上一讲中已经讲过,这一讲的主要内容是如何为控件添加消息处理函数. MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消 ...
- VS2010/MFC编程入门教程之目录和总结
鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够.以此教程的知识为基础,学习VS2010/MFC较为深入的内容 ...
- VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)
前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例. 树形控件的创建 MFC为树形控件提 ...
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...
- VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
前面一节中,鸡啄米讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见, ...
- VS2010/MFC编程入门之二十(常用控件:静态文本框)
上一节鸡啄米讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始鸡啄米将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组 ...
随机推荐
- json转字符串,json转list,json转pojo的工具类
package com.loveshop.util; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingEx ...
- C++11 auto 与 右值
auto: auto T = xxx; // 产生一个变量,自动推导变量类型. 存在变量拷贝的消耗.auto& T = xxx; // 产生一个变量的引用,自动推导变量类型.减少拷贝的消耗. ...
- html 通过input video canvas 打开摄像头 定制相机
在机缘巧合之下,了解到用HTML5和javascript调用摄像头来实现拍照功能,今天就把大致原理写下来.页面布局很简单,就是一个input标签,两个HTML5元素video.canvas和一个but ...
- Flink开发-IDEA scala开发环境搭建
现在大数据相关服务,越来越倾向于使用scala语言,scala函数式编程的优势我不多赘述.最明显的一个优点,代码简洁.看个WordCount实现对比: Java版WordCount Execution ...
- Redis探索之路(二):Redis在linux下的安装
目前最新稳定版本为:2.4.17.tar.gz .redis-2.6.10.tar.gz wget http://redis.googlecode.com/files/redis-2.4.17.tar ...
- [转]C# 动态调用 WebService
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...
- 水一帖:快速计算ceil(a/b)的方式
今天拍脑袋想出来的,不用ceil函数,不用浮点运算,不用取模,兼顾运行常数和代码量的向上取整除方法 在保证a,b>0时 ceil(a/b)=(a-1)/b+1; (完)
- Apache负载均衡
Apache负载均衡 Apache也是可以实现负载均衡的.Apache的负载均衡主要是通过mod_proxy_balancer实现的.那么,apache负载均衡的配置方法是什么样的? 在apache的 ...
- window location跳转
"top.location.href"是最外层的页面跳转"window.location.href"."location.href"是本页面 ...
- iOS之NSArray数组排序
一.数组遍历 除了常用的for和for-in遍历外,系统还提供了三种枚举遍历,对于大量的数据遍历可以使用下列三个方法. - (void)enumerateObjectsUsingBlock:(void ...