初始操作
新建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);