方法很简单,一句话总结:定义用户定义状态,并对不同的状态(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;
Bookmark
Email This
Hits: 5111
Comments (0)

Write comment



