树控件结点的插入使用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);
一般情况下使用最后两种形式,一种是用于插入结点,另一种增加了对图标的插入操作。
树控件可以用于树结构,其中有一个根结点(Root)然后下面有许多子结点,而每个子结点上允许有一个或多个或没有子结点。在树控件中每一个结点都有一个句柄(HTREEITEM),同时添加结点时必须提供的参数是该结点的父结点句柄,(其中根Root结点只有一个,既不可以添加也不可以删除)利用
HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );可以添加一个结点,pszItem为显示的字符,hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。如例子中,在调用了Create()函数之后进行了结点的插入操作它生成了如下形式的树结构:
+--- Parent1
+--- Child1_1
+--- Child1_2
+--- Child1_3
+--- Parent2
+--- Parent3
如果你希望在每个结点前添加一个小图像,就必需先调用CTreeCtrl:: SetImageList( CImageList * pImageList, int nImageListType );指明当前所使用的ImageList,nImageListType为TVSIL_NORMAL。在调用完成后控件中使用图片以设置的ImageList中图片为准。然后调用
HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);添加结点,nImage为结点没被选中时所使用图片序号,nSelectedImage为结点被选中时所使用图片序号。下面的代码演示了ImageList的设置。
/*m_list 为CImageList对象IDB_TREE 为16*(16*4)的位图,每个图片为16*16共4个图标*/
m_list.Create(IDB_TREE,16, 4, RGB(0,0,0));
m_tree.SetImageList(&m_list,TVSIL_NORMAL);
m_tree.InsertItem("Parent1" , 0, 1);//添加,选中时显示图像1,未选中时显示图像0
添加结点最复杂的函数是前两个,它们使用了各种结构以及字段值来标识结点所处的状态和属性。
第一个函数:
HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );
要求传入一个TVINSERTSTRUCT结构的指针。它的定义为:(包括两个结点句柄,一个描述树控件结点的结构)
//TVINSERTSTRUCT
typedef struct tagTVINSERTSTRUCT {
HTREEITEM hParent; //父结点句柄
HTREEITEM hInsertAfter; //插入其后的结点句柄
#if (_WIN32_IE >= 0x0400)
union
{
TVITEMEX itemex;
TVITEM item;
} DUMMYUNIONNAME;
#else
TVITEM item; //描述树控件结点的结构
#endif
} TVINSERTSTRUCT, FAR *LPTVINSERTSTRUCT;
而TVITEM定义为:
//TVITEM
typedef struct tagTVITEM{
UINT mask;
HTREEITEM hItem;
UINT state;
UINT stateMask;
LPTSTR pszText;
int cchTextMax;
int iImage;
int iSelectedImage;
int cChildren;
LPARAM lParam;
} TVITEM, FAR *LPTVITEM;
mask
一组标志位,表明哪个成员数据是有效的。当此结构用于TVM_GETITEM消息时,mask成员表示获得的项属性。它可以是以下值中的一个或多个组合:
TVIF_CHILDREN :cChildren 成员有效;
TVIF_HANDLE :hItem 成员有效;
TVIF_IMAGE :iImage 成员有效;
TVIF_PARAM :lParam成员有效;
TVIF_SELECTEDIMAGE :iSelectedImage成员有效;
TVIF_STATE :state 和 stateMask成员有效;
TVIF_TEXT :pszText 和 cchTextMax成员有效。
hItem
表示相关项的句柄。
state
一组标志位以及图像列表索引,表示项状态。当设置项状态时,stateMask表示此成员的哪些位是有效的;当获取项状态时,此成员返回由stateMask指示的当前有效的项状态位。此成员的0到7位包含项状态标志。见附录。8到11位代表从1开始的覆盖图像索引。覆盖图像用来叠加在项图像上。如果这些位是0,那么项就没有覆盖图像。为了隔离这些位,使用TVIS_OVERLAYMASK掩码(mask)。要设置项覆盖图像索引,应该使用INDEXTOOVERLAYMASK宏。图像列表的覆盖图像使用ImageList::SetOverlayImage()函数设置。因为使用的从 1 开始的索引是 4 位的,所以覆盖图像必须在图像列表的前 15 位。12到15位代表项状态图像索引。状态图像显示在项图标的旁边,表示应用程序定义的状态。也就是说指定了状态图像后,树控件就在每项的图标左边为状态图像保留空间。应用程序可以用状态图像(如选定和未选定的复选框)指示应用程序定义的项状态。如果这些位是0,那么就没有状态图像。为了隔离这些位,使用TVIS_STATEIMAGEMASK掩码(mask)。要设置状态图像,应该使用INDEXTOSTATEIMAGEMASK宏。状态图像索引表示要画的图像列表的图像索引。状态图像列表由TVM_SETIMAGELIST消息指定。
0 件のコメント:
コメントを投稿