首先是CImageList控件,用来保存一组相同大小的图标或位图,它没有图形显示界面,主要用途是为其它控件提供图形列表。可以通过索引访问图标或位图。CImageList常用的函数有:
函数 说明
Create 创建一个CImageList控件
GetImageCount 获取图像的数目
GetImageInfo 获取图像信息
Add 添加图像到图像列表控件
Remove 从列表中删除图像
Replace 替换列表中指定的图像
例如:
CImageList m_imageList;
//创建CImageList对象
m_imageList.Create(16, 16, ILC_COLOR8, 0, 4);
//加载图标
m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_ROOT));
然后该CTreeCtrl了,这是一个树形列表控件,提供了分层级结构显示数据的功能。这个控件有可视化的界面,可以通过界面编辑器进行创建,只需要拉到界面上即可;同样也可以通过Create函数创建一个树形列表控件,由于这种方法通常不用,这里不再赘言。另外该控件还有很多树形,如Has Button、Has Line等,可以在界面编辑器的属性中查看并设置。
树形控件有两个非常重要的数据结构:TV_ITEM和TV_INSERTSTRUCT。前者用来描述一个树节点的信息;后者描述要插入树时所需的信息。结构如下:
typedef struct _TV_ITEM {
UINT mask; //结构成员有效性屏蔽位
HTREEITEM hItem; //数据项控制句柄
UINT state; //数据项状态
UINT stateMask; //状态有效性屏蔽位
LPSTR pszText; //数据项名称字符串
int cchTextMax; //数据项名称的最大长度
int iImage; //数据项图标索引号
int iSelectedImage; //选中数据项图标索引号
int cChildren; //子项标识
LPARAM lParam; //程序定义的32位数据TVIF_PARAM
} TV_ITEM, FAR *LPTV_ITEM;
typedef struct _TV_INSER TSTRUCT
{
HTREEITEM hParent; //父项控制句柄
HTREEITEM hInsertAfter; //插入树项的位置
TV_ITEM item; //数据项的结构
} TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT;
使用CImageList可以方便的为CTreeCtrl提供图标。首先设置树形控件的图形列表:
m_treeStruct.SetImageList(&m_imageList,TVSIL_NORMAL);
然后在添加树形列表节点时可以设置节点的选中时图标索引和未选中时的图标索引。如果没有设置,则数据结构会默认为0。数据结构为上面的TV_ITEM。
向树形控件中添加根节点
添加根节点是比较麻烦的,具体代码如下:
TVINSERTSTRUCT tvInsert; //定义一个插入结构
HTREEITEM hParent; //用来保存插入的位置
tvInsert.hParent = NULL; //设置父节点为空