国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
VC中三態(tài)選擇樹(shù)實(shí)現(xiàn)的終結(jié)者
源碼下載


  示例代碼運(yùn)行效果圖如下:

  


    在很多情況下,我們經(jīng)常需要實(shí)現(xiàn)樹(shù)的多態(tài)選擇,如上圖所示,當(dāng)全部子節(jié)點(diǎn)選中的情況下,當(dāng)前節(jié)點(diǎn)才被選中(如圖示[荊門(mén)市]節(jié)點(diǎn)),當(dāng)子節(jié)點(diǎn)部分選中時(shí),當(dāng)前節(jié)點(diǎn)處于第三態(tài)(如圖示[湖北省]節(jié)點(diǎn))當(dāng)全部子節(jié)點(diǎn)未選中時(shí),當(dāng)前節(jié)點(diǎn)處于未選中的狀態(tài)(如圖示[江蘇省]節(jié)點(diǎn))。本文就介紹這種三態(tài)選擇樹(shù)的具體實(shí)現(xiàn)方法。

  在VC知識(shí)庫(kù)第十九期中河南科技大學(xué)叢雷朋友也介紹了一種實(shí)現(xiàn)方法,兩種方法比較,本文介紹的方法實(shí)現(xiàn)簡(jiǎn)單,兼容原CTreeCtrl的全部操作,CheckBox也是采用控件本身的CheckBox,只是在狀態(tài)顯示時(shí)重畫(huà)而已。因此,本方法可以實(shí)現(xiàn)表示三態(tài)的情況下同時(shí)顯示節(jié)點(diǎn)ICON圖標(biāo),另增加了對(duì)CheckBox在某些節(jié)點(diǎn)是否顯示的控制,同時(shí)增加了對(duì)鍵盤(pán)空格鍵選中、取消選中的控制。具體遍歷父、子節(jié)點(diǎn)的方法同叢雷朋友朋友的方法類(lèi)似,也是遞歸實(shí)現(xiàn)全部節(jié)點(diǎn)的遍歷,只是優(yōu)化了一些,效率更高。

  下面介紹具體使用方法:

  步驟一:生成一個(gè)對(duì)話框工程(示例工程CMutiTree)。

    步驟二:添加樹(shù)控件,按照實(shí)際需要設(shè)置所需的屬性。

    步驟三:做節(jié)點(diǎn)圖標(biāo)和三態(tài)選擇框圖標(biāo)

  



  一般情況下節(jié)點(diǎn)圖標(biāo)采用16×16,三態(tài)選擇圖標(biāo)采用13×13大小比較合適。
  三態(tài)選擇圖標(biāo)對(duì)應(yīng): 0->無(wú)選擇鈕 1->沒(méi)有選擇 2->部分選擇 3->全部選擇

  步驟四:將兩個(gè)文件[MutiTreeCtrl.cpp ,MutiTreeCtrl.h]添加到步驟一創(chuàng)建的對(duì)話框

  工程中,在CMutiTreeDlg類(lèi)的頭文件中增加對(duì)[MutiTreeCtrl.h]的包含,此時(shí)工程中增加了CMutiTreeCtrl類(lèi)。


#include "MutiTreeCtrl.h"
  步驟五:用ClassWizard在CmutiTreeDlg中創(chuàng)建一個(gè)樹(shù)控件CTreeCtrl的對(duì)象m_TripleTree,更改該對(duì)象為上面步驟四加入的CMutiTreeCtrl類(lèi)的對(duì)象。

  步驟六:在CMutiTreeDlg類(lèi)中定義兩個(gè)CImageList 類(lèi)的對(duì)象,用于加載CMutiTreeCtrl所需要的節(jié)點(diǎn)圖標(biāo)列表和三態(tài)選擇框圖標(biāo)列表。
在CMutiTreeDlg類(lèi)的頭文件中:
CImageList m_imgList;
CImageList m_imgState;

  在對(duì)話框的初始化函數(shù)中:m_imgState.Create(IDB_BITMAP_STATE,13, 1, RGB(255,255,255));
m_imgList.Create(IDB_BITMAP_LIST,16, 1, RGB(255,255,255));

m_TripleTree.SetImageList(&m_imgList,TVSIL_NORMAL);
m_TripleTree.SetImageList(&m_imgState,TVSIL_STATE);

  完成以上六步操作后,編譯、運(yùn)行,用鍵盤(pán)空格鍵或鼠標(biāo)單擊CheckBox改變其狀態(tài),您將看到不需要再增加任何代碼,已經(jīng)實(shí)現(xiàn)了三態(tài)選擇樹(shù)的功能。如果需要隱藏某些選擇框,如根節(jié)點(diǎn)的選擇框,只需要設(shè)置對(duì)應(yīng)的節(jié)點(diǎn)狀態(tài)為0即可: m_TripleTree.SetItemState( hRoot, INDEXTOSTATEIMAGEMASK(0),
TVIS_STATEIMAGEMASK );

  上述代碼將設(shè)置根節(jié)點(diǎn)不顯示三態(tài)選擇框。
我具體實(shí)現(xiàn)的思想是以Windows標(biāo)準(zhǔn)的CTreeCtrl類(lèi)為基類(lèi)派生一個(gè)類(lèi)CMutiTreeCtrl,截獲鍵盤(pán)和鼠標(biāo)點(diǎn)擊CheckBox的事件,在此消息響應(yīng)函數(shù)中,更改CheckBox的狀態(tài),并搜索子節(jié)點(diǎn)、兄弟節(jié)點(diǎn)和父節(jié)點(diǎn),更改其狀態(tài)與上述邏輯一致。方法如下介紹:
  一、 CTreeCtrl類(lèi)為基類(lèi)派生CMutiTreeCtrl類(lèi)

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()函數(shù),在調(diào)用了基類(lèi)的SetItemState()函數(shù)修改了節(jié)點(diǎn)狀態(tài)以后,遍歷一遍當(dāng)前節(jié)點(diǎn)子節(jié)點(diǎn)、兄弟節(jié)點(diǎn)、父節(jié)點(diǎn),按照上述邏輯修改為相應(yīng)的狀態(tài),實(shí)現(xiàn)三態(tài)顯示。調(diào)用此函數(shù)有二種情況:

 ?、冁I盤(pán)或鼠標(biāo)輸入修改節(jié)點(diǎn)狀態(tài),此時(shí)要遍歷全部父、兄、子節(jié)點(diǎn);
 ?、诔绦蚋鶕?jù)實(shí)際情況調(diào)用修改節(jié)點(diǎn)狀態(tài),因?yàn)樾薷墓?jié)點(diǎn)狀態(tài)時(shí)是判斷了全部子節(jié)點(diǎn)的狀態(tài)后得出了狀態(tài),所以此時(shí)僅需要遍歷全部的兄、父節(jié)點(diǎn),更改其狀態(tài)符合邏輯。故在重載的函數(shù)后面加了一個(gè)缺省為T(mén)RUE的bSearch變量,當(dāng)程序修改節(jié)點(diǎn)時(shí)請(qǐng)置此標(biāo)志為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;
}

  三、檢測(cè)鼠標(biāo)單擊節(jié)點(diǎn)CHeckBox的事件,更改對(duì)應(yīng)的節(jié)點(diǎn)狀態(tài)并遍歷樹(shù)的其他節(jié)點(diǎn)。 void CMutiTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
HTREEITEM hItem =HitTest(point, &m_uFlags);
if ( (m_uFlags&TVHT_ONITEMSTATEICON ))
{
//nState: 0->無(wú)選擇鈕 1->沒(méi)有選擇 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;
}
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MFC,實(shí)現(xiàn)三態(tài)樹(shù)形控件以及父子節(jié)點(diǎn)聯(lián)動(dòng)
CTreeCtrl重載時(shí)若干個(gè)技巧
VC程序中樹(shù)型控件節(jié)點(diǎn)拖動(dòng)的完美實(shí)現(xiàn)
VC中如何使用CTreeCtrl控件 - 春天的事業(yè) - 草根IT工作者謝春業(yè)的博客,探討...
vc 控件 自繪
【材料整理】VC 樹(shù)形控件 例子及相關(guān)知識(shí)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服