MFC之树控件

Posted echobiscuit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC之树控件相关的知识,希望对你有一定的参考价值。

初始操作

新建MFC应用程序,项目名为TreeCtrl,同样基于对话框。

删除原有控件在右侧工具箱中找到Tree Control。放置到窗口中。如图:

技术图片

右键属性,找到Has Lines,改为True。则原来的节点和叶之间会出现虚线相连。如图:

技术图片

同样属性中,找到Has Buttons,改为True,则会出现加号按钮,具体看图:

技术图片

找到Lines At Root,改为True,则根节点会出现虚线相连,如图:

技术图片

控件中右键,选择添加变量,访问方式:private,变量名:n_tree。

定位到:类视图--CTreeCtrlDlg--OnInitDialg()中,在其中添加代码。

添加图片资源

将图片保存到所在项目res文件夹下:

技术图片

在资源视图中找到icon,右键添加资源,点击导入,即可添加想要的图片:

技术图片

添加四张图片后:

技术图片

CImageList::Create()函数

BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );
BOOL Create( LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREFcrMask );
BOOL Create( CImageList& ImageList1, int nImage1, CImageList& ImageList2, int nImage2, int dx, int dy );

返回值:如果成功,则返回非零值,否则为0。

参数:
cx 每个图象的尺寸,以像素为单位。
cy 每个图象的尺寸,以像素为单位。
nFlags 确定创建的图象列表类型。此参数可能为以下值的组合,但只能有一个ILC_COLOR值

值 含义
ILC_COLOR 如果没有其它ILC_COLOR* 标记被确定,则使用缺省行为。典型地,缺省为ILC_COLOR4;但对于旧的显示驱动程序,缺省为ILC_COLORDDB
ILC_COLOR4 使用4位(16色)设备独立位图(DIB)部分作为图象列表的位图
ILC_COLOR8 使用8位DIB部分。彩色表格使用的颜色与半色调调色板的一样
ILC_COLOR16 使用16位(32/64K色)DIB部分
ILC_COLOR24 使用24位DIB部分
ILC_COLOR32 使用32位DIB部分
ILC_COLORDDB 使用设备独立位图
ILC_MASK 使用掩码。图象列表包含两个位图,其中一个是用做掩码的位图。如果不包括此值,图象列表只包含一个位图

nInitial 图象列表最初包含的图象数。
nGrow 当系统需要改变列表为新图象准备空间时,图象列表可生成的图象数。此参数替代改变的图象列表所能包含的新图象数。
nBitmapID 与图象列表联系的位图的源ID。
crMask 用于生成一个掩码的颜色。此指定的位图中的颜色的每个像素变为黑色,掩码中相应位设置为1。
lpszBitmapID 包含图象的源ID的字符串。
ImageList1 CImageList对象的参考。
nImage1 第一个存在的图象的索引。
ImageList2 CImageList对象的参考。
nImage2 第二个存在的图象的索引。
dx 每个图象的尺寸,用像素表示。
dy 每个图象的尺寸,用像素表示。

说明:
需要两步构造一个CImageList。首先调用构造函数,然后调用Create,创建图象列表并附加给CImageList对象。

CTreeCtrl::SetImageList()函数

CImageList* SetImageList( CImageList* pImageList, int nImageListType );

返回值:
返回指向先前的图像列表的指针(如果有);否则返回NULL。

参数:
pImageList 指向要被分配的图像列表的指针。如果pImageList是NULL,则从tree view控件中删除所有的图像。
nImageListType 要设置的图像列表的类型。图像列表可以是下列值之一:
· TVSIL_NORMAL 获取常规的图像列表,它包含了该tree view项的被选择的和不被选择的图像。
· TVSIL_STATE 获取状态图像列表,它包含了处于用户定义状态的treeview项的图像。

说明:
此成员函数用来设置一个tree view控件的常规或状态图像列表,并使用新的图像来重画该tree view项的图像。

CTreeCtrl::InsertItem()函数

HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );
HTREEITEM InsertItem( UINT nMask,
LPCTSTR lpszItem,
int nImage,
int nSelectedImage,
UINT nState,
UINT nStateMask,
LPARAM lParam,
HTREEITEM hParent,
HTREEITEM hInsertAfter
);

HTREEITEM InsertItem( LPCTSTR lpszItem,
HTREEITEM hParent = TVI_ROOT,
HTREEITEM hInsertAfter = TVI_LAST
);

HTREEITEM InsertItem( LPCTSTR lpszItem,
int nImage,
int nSelectedImage,
HTREEITEM hParent = TVI_ROOT,
HTREEITEM hInsertAfter = TVI_LAST
);

返回值:如果成功则返回新项的句柄;否则返回NULL。

参数: lpInsertStruct 一个指向用来指定要插入的tree view项的属性的TVINSERTSTRUCT的指针。
nMask 用来指定要设置的属性的整数。
lpszItem 一个包含项的文本的字符串的地址。
nImage 项的图像在tree view控件的图像列表中的索引。
nSelectedImage 项的被选择图像在tree view控件的图像列表中的索引。
nState 为项的状态指定的值。
nStateMask 指定要设置的状态。
lParam 与此项关联的一个32位的应用程序指定的值。
hParent 要被插入的项的父项的句柄。
hInsertAfter 新项要被插入其后的项的句柄。

说明:
此成员函数用来在一个tree view控件中插入一个新项。

添加代码

初始化函数中添加代码

//1.设置图标

//准备HICON图标
HICON icons[4];
icons[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
icons[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
icons[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
icons[3] = AfxGetApp()->LoadIconW(IDI_ICON4);
	
CImageList list;

//创建图片集合
list.Create(30, 30, ILC_COLOR32, 4, 4);

//添加具体图片
for(int i = 0; i < 4; i++)
{
	list.Add(icons[i]);
}

n_tree.SetImageList(&list, TVSIL_NORMAL);

//2.设置节点
//                           参数: 1.节点名称 2.默认显示节点的索引 3.被选择图像的索引 4.此节点的父节点
HTREEITEM root = n_tree.InsertItem(TEXT("根节点"), 0, 0, NULL);
HTREEITEM parent = n_tree.InsertItem(TEXT("父节点"), 1, 1, root);
HTREEITEM sub1 = n_tree.InsertItem(TEXT("子节点1"), 2, 2, parent);
HTREEITEM sub2 = n_tree.InsertItem(TEXT("子节点2"), 3, 3, parent);

执行结果:

技术图片

此时添加的图片并未显示出来。

完善已添加代码

上面代码中函数执行完,才去找图片资源,而CImageList list保存在栈中,图片资源后面会被释放掉,必须保存这个集合,写到.h中成为成员属性。所以先注释掉这行。

双击dlg定位到.h文件中。在private中添加CImageList list; 如图所示:

技术图片

此时执行,结果如下图,图片显示成功:

技术图片

其他一些API以及作用

1.设置默认选项

技术图片

n_tree.SelectItem(sub1);

设置后运行程序,直接定位在子节点1上。

2.不同节点切换时,触发事件。
回到界面视图中(即Dialog中),右键属性,选择控件事件(图标中闪电状)

技术图片

然后在其中添加想要触发的东西

//切换时,打印当前项内容(切换后的内容)

//获取当前项
HTREEITEM item = n_tree.GetSelectedItem();

CString name = n_tree.GetItemText(item);

MessageBox(name);                     //弹出内容

执行后成功显示。

注意执行的时候,会直接先弹出节点1,因为之前的代码有设置节点1为默认项。相应代码如下:

//设置默认选项
n_tree.SelectItem(sub1);

以上是关于MFC之树控件的主要内容,如果未能解决你的问题,请参考以下文章

MFC:从控件本身的代码限制子控件的大小

mfc tab控件

编辑控件 MFC 中光标位置更改时是不是有通知代码?

MFC 中关于Edit控件问题

翻译一段代码 mfc的 这是有关动态创建控件的

我将 png 加载到 mfc 静态图片控件的代码有啥问题?