Visual studio C++ MFC之树形控件Tree Control
背景
本篇旨在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
Visual studio C++ MFC之树形控件Tree Control的更多相关文章
- Visual studio C++ MFC之列表控件CListCtrl Control
背景 本篇旨在MSDN帮助文档下总结列表控件CListCtrl Control的使用,并列出碰到的具体问题. 正文 列表型控件List Control的类是ClistCtrl,具体成员对象详见链接,以 ...
- VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)
前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例. 树形控件的创建 MFC为树形控件提 ...
- VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)
前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...
- VS2010-MFC(常用控件:树形控件Tree Control 下)
转自:http://www.jizhuomi.com/software/203.html 前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件 ...
- VS2010-MFC(常用控件:树形控件Tree Control 上)
转自:http://www.jizhuomi.com/software/200.html 前面两节讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Contr ...
- ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID
使用element-ui tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys 后,发现只能返回子节点的ID,但是其父节点ID没有返回. 解决办法有三种: 1.element ...
- 关于elment-ui树形控件Tree的使用
如果简单使用的tree树形控件,按照Element ui Tree 树形控件 官方文档使用即可,基本上能够完成大部分的需求. 但是如果需要对树形结构进行额外操作,仅仅根据官方文档提供的方案的话,可能就 ...
- (八)树控件(Tree Control),标签控件(tab control)
树控件 基于对话框创建工程 // 01_TreeCtrlDlg.cpp : 实现文件 // #include "stdafx.h" #include "01_TreeCt ...
- 解决Visual Studio 找不到报表控件、rdlc中文乱码
找回报表控件 运行安装程序中的 ..\packages\Reporting Services\RVAddon.msi 工具栏,右键选择ReportViewer,注意选择的版本 如果不能编辑报表文件(. ...
随机推荐
- mysql数据库设计之三范式
第一范式: 第二范式: 正解: 第三范式: 示例: 正解: BC范式: 示例: 正解:
- hit2739
好题,回路的问题一般都要转化为度数来做若原图的基图不连通,或者存在某个点的入度或出度为0则无解.统计所有点的入度出度之差di对于di>0的点,加边(s,i,di,0):对于di<0的点,加 ...
- C# 通过串口发送短信
手机短信群发作为企业日常通知,公告,天气预报等信息的一个发布平台,在于成本低,操作方便等诸多特点,成为企业通讯之首选.本文介绍短信的编码方式,AT指令以及用C#实现串口通讯的方法. 前言目前,发送短信 ...
- dart Stream
- 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】
[链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...
- noi题库 1.7 字符串
前九题 01:统计数字字符个数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一行字符,统计出其中数字字符的个数. 输入 一行字符串,总长度不超过255. 输出 输出为1行,输出字 ...
- Xamarin XAML语言教程基本视图ContentView
Xamarin XAML语言教程基本视图ContentView 基本视图ContentView 视图是用来呈现具体内容,根据呈现内容不同,使用的视图也不同.其中,最常用的视图为ContentView视 ...
- String和StringBuffer的机制差别
String是不可变的,StringBuffer是可变的:StringBuffer是线程安全的,StringBuilder是非线程安全的. 因而在大部分情况下字符串的拼接速度为:StringBuild ...
- [BZOJ 3152] 组合子逻辑
Link: BZOJ 3152 传送门 Solution: 喜闻乐见,gyz出的语文题,题意要看半小时 题意:使用最少的括号将序列分割,对于每个括号中的序列,设最左边的数为$num$,序列中元素个数为 ...
- 求小于10000的素数的个数 Exercise06_10
/** * @author 冰樱梦 * 时间:2018年下半年 * 题目:求小于10000的素数的个数 * */ public class Exercise06_10 { public static ...