WEB开发网
开发学院软件开发VC 三态选择树实现终结者 阅读

三态选择树实现终结者

 2007-10-05 20:22:20 来源:WEB开发网   
核心提示:一、 CTreeCtrl类为基类派生CMutiTreeCtrl类class CMutiTreeCtrl : public CTreeCtrl{// Constructionpublic: CMutiTreeCtrl();// Attributespublic:// Operationspublic:// Overrid

一、 CTreeCtrl类为基类派生CMutiTreeCtrl类

class CMutiTreeCtrl : public CTreeCtrl
{
// Construction
public:
   CMutiTreeCtrl();
// Attributes
public:
// Operations
public:
// Overrides
   // ClassWizard generated virtual function overrides
   //{{AFX_VIRTUAL(CMutiTreeCtrl)
   //}}AFX_VIRTUAL
// Implementation
public:
   BOOL SetItemState( HTREEITEM hItem, UINT nState, UINT nStateMask, BOOL bSearch=TRUE);
   virtual ~CMutiTreeCtrl();
   // Generated message map functions
protected:
   //{{AFX_MSG(CMutiTreeCtrl)
   afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
   afx_msg void OnStateIconClick(NMHDR* pNMHDR, LRESULT* pResult);
   afx_msg void OnKeydown(NMHDR* pNMHDR, LRESULT* pResult);
   afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
   //}}AFX_MSG
   DECLARE_MESSAGE_MAP()
private:
   UINT m_uFlags;
   void TravelSiblingAndParent(HTREEITEM hItem, int nState);
   void TravelChild(HTREEITEM hItem,int nState);
};
二、重载CTreeCtrl的SetItemState()函数,在调用了基类的SetItemState()函数修改了节点状态以后,遍历一遍当前节点子节点、兄弟节点、父节点,按照上述逻辑修改为相应的状态,实现三态显示。调用此函数有二种情况:

①键盘或鼠标输入修改节点状态,此时要遍历全部父、兄、子节点;

②程序根据实际情况调用修改节点状态,因为修改节点状态时是判断了全部子节点的状态后得出了状态,所以此时仅需要遍历全部的兄、父节点,更改其状态符合逻辑。故在重载的函数后面加了一个缺省为TRUE的bSearch变量,当程序修改节点时请置此标志为FALSE。BOOL CMutiTreeCtrl::SetItemState(HTREEITEM hItem, UINT nState,
UINT nStateMask, BOOL bSearch)
{
   BOOL bReturn=CTreeCtrl::SetItemState( hItem, nState, nStateMask );
   UINT iState = nState >> 12;
   if(iState!=0)
   {
     if(bSearch) TravelChild(hItem, iState);
     TravelSiblingAndParent(hItem,iState);
   }
   return bReturn;
}
三、检测鼠标单击节点CHeckBox的事件,更改对应的节点状态并遍历树的其他节点。

void CMutiTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
   HTREEITEM hItem =HitTest(point, &m_uFlags);
   if ( (m_uFlags&TVHT_ONITEMSTATEICON ))
   {
     //nState: 0->无选择钮 1->没有选择 2->部分选择 3->全部选择
     UINT nState = GetItemState( hItem, TVIS_STATEIMAGEMASK ) >> 12;
     nState=(nState==3)?1:3;
     SetItemState(hItem,INDEXTOSTATEIMAGEMASK(nState),TVIS_STATEIMAGEMASK);
   }
  
   CTreeCtrl::OnLButtonDown(nFlags, point);
}
void CMutiTreeCtrl::OnStateIconClick(NMHDR* pNMHDR, LRESULT* pResult)
{
   if(m_uFlags&TVHT_ONITEMSTATEICON) *pResult=1;
   else *pResult = 0;
}

上一页  1 2 3 4 5  下一页

Tags:选择 实现 终结者

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接