资料收集站

SDL

Wednesday
Dec 03rd
Text size
  • Increase font size
  • Default font size
  • Decrease font size

方法很简单,一句话总结:定义用户定义状态,并对不同的状态(state)使用不同的图片。

在下面的sample中,我们使用CTreeListCtrl作为父类。由于TreeList control支持一些现有state 所以用户定义的state必需使用INDEXTOSTATEIMAGEMASK(i)进行变换。

如果对本文所讲的方法有不明的地方,可以先熟悉一下TreeList Control的使用,然后再看本文。

Step 1: 创建state list image

创建的图片有三种状态。

state ImageList只是用于和state改变有关的显示图片,TreeList Control中还应包含其他image List,如:焦点选择改变的imageList,用于在选中和未选中是改变显示图片。

Step 2: 初始化

CImageList m_imageState; 成员变量

m_imageState.Create( IDB_STATE, 13, 1, RGB(255,255,255) );//创建ImageList

m_tree.SetImageList( &(m_tree.m_imageState), TVSIL_STATE );//在TreeList中加入表示状态的ImageList。

Step 3: 增加结点时设置标记

重新定义一个InsertItem函数。使用TV_INSERTSTRUCT来插入结点。

即使用函数HTREEITEM InsertItem( LPTV_INSERTSTRUCT lpInsertStruct );

lpInsertStruct->item.mask |= TVIF_STATE   ;//保证state 和stateMask是有效的。

你必须在TV_ITEM中标明state和stateMask。(INDEXTOSTATEIMAGEMASK宏可以得到state image的下标)

state 设置为INDEXTOSTATEIMAGEMASK(1)表示用户定义的第一种状态

stateMask设置为TVIS_STATEIMAGEMASK.表示用户定义的状态。

当然也可以调用SetItemState设置state.

SetItemState( hItem, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK );

Step 4: 增加mouse button down消息映射

通过使用HitTest来得知是否按在State图片上。并需要得到当前state。

void CTreeCtrlX::OnLButtonDown(UINT nFlags, CPoint point) 


	UINT uFlags=0;

	HTREEITEM hti = HitTest(point,&uFlags);

	if( uFlags & TVHT_ONITEMSTATEICON )


		int iImage = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12;                 

                       //GetItemState( hti, TVIS_STATEIMAGEMASK )>>12 对用户定义state反变换

		SetItemState( hti, INDEXTOSTATEIMAGEMASK(iImage == 1 ? 2 : 1), 

					TVIS_STATEIMAGEMASK );

		return;



Step 5:处理 OnKeyDown

void CTreeCtrlX::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 


	if( nChar == VK_SPACE )


		HTREEITEM hti = GetSelectedItem();

		int iImage = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12;

		SetItemState( hti, INDEXTOSTATEIMAGEMASK(iImage == 1 ? 2 : 1),

					TVIS_STATEIMAGEMASK );

		return;



Step 6: 增加其他的功能函数

BOOL CTreeCtrlX::IsItemChecked(HTREEITEM hItem)


	return GetItemState( hItem, TVIS_STATEIMAGEMASK )>>12 == 2;


HTREEITEM CTreeCtrlX::GetFirstCheckedItem()


	for ( HTREEITEM hItem = GetRootItem(); hItem!=NULL; hItem = GetNextItem( hItem ) )

		if ( IsItemChecked(hItem) )

			return hItem;

	return NULL;


HTREEITEM CTreeCtrlX::GetNextCheckedItem( HTREEITEM hItem )


	for ( hItem = GetNextItem( hItem ); hItem!=NULL; hItem = GetNextItem( hItem ) )

		if ( IsItemChecked(hItem) )

			return hItem;

	return NULL;


HTREEITEM CTreeCtrlX::GetPrevCheckedItem( HTREEITEM hItem )


	for ( hItem = GetPrevItem( hItem ); hItem!=NULL; hItem = GetPrevItem( hItem ) )

		if ( IsItemChecked(hItem) )

			return hItem;

	return NULL;

Comments (0)Add Comment

Write comment

busy
 

Google 搜索

在线用户

We have 54 guests online