2007年5月26日土曜日

树控件的结点插入

树控件结点的插入使用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 件のコメント: