C++ CTreeview的checkbox使用方法
1. 消息事件
(1)鼠標(biāo)點(diǎn)擊當(dāng)前ITEM的CHECKBOX:引發(fā)NM_CLICK事件并傳遞TVHT_ONITEMSTATEICON。
(2)鼠標(biāo)點(diǎn)擊當(dāng)前ITEM的TEXT:引發(fā)NM_CLICK事件。
(3)鼠標(biāo)點(diǎn)擊新ITEM的CHECKBOX:引發(fā)TVN_SELCHANGED事件、NM_CLICK事件并傳遞TVHT_ONITEMSTATEICON。
(4)鼠標(biāo)點(diǎn)擊新ITEM的TEXT:引發(fā)NM_CLICK事件、TVN_SELCHANGED事件。
2. 消息事件總結(jié)
點(diǎn)擊ITEM會引發(fā)NM_CLICK事件。若點(diǎn)擊CHECKBOX則傳遞TVHT_ONITEMSTATEICON。
因此可不處理TVN_SELCHANGED事件而只處理NM_CLICK事件。
3. 消息處理注意事項(xiàng)
(1)點(diǎn)擊CHECKBOX后會自動更新CheckBox的狀態(tài),因此在處理代碼中不需要使用SetCheck函數(shù)設(shè)置狀態(tài),而GetCheck函數(shù)返回也是其原始狀態(tài)。
(2)點(diǎn)擊新CHECKBOX后不會自動將對應(yīng)的ITEM設(shè)置為選擇狀態(tài),需要使用SelectItem函數(shù)進(jìn)行設(shè)置。
4. 使用方法
(1)若傳遞TVHT_ONITEMSTATEICON
獲取選擇ITEM的狀態(tài)并取反
若有子項(xiàng)則所有子項(xiàng)設(shè)置為一致
若沒有子項(xiàng)則
若當(dāng)前狀態(tài)為TRUE則設(shè)置父項(xiàng)為TRUE;否則遍歷所有兄弟項(xiàng),若全為FALSE則設(shè)置父項(xiàng)為FALSE。
若選擇了新ITEM則設(shè)置新ITEM為選擇項(xiàng)
(2)若未傳遞TVHT_ONITEMSTATEICON
設(shè)置更新ITEM狀態(tài),獲取選擇ITEM的狀態(tài)
若有子項(xiàng)則所有子項(xiàng)設(shè)置為一致
若沒有子項(xiàng)則
若當(dāng)前狀態(tài)為TRUE則設(shè)置父項(xiàng)為TRUE;否則遍歷所有兄弟項(xiàng),若全為FALSE則設(shè)置父項(xiàng)為FALSE。
5. 響應(yīng)NM_CLICK事件的函數(shù)代碼
void CTestTimerDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint point;
UINT uFlag; //接收有關(guān)點(diǎn)擊測試的信息的整數(shù)
HTREEITEM hTree;
BOOL bCheck;
GetCursorPos(&point); //獲取屏幕鼠標(biāo)坐標(biāo)
m_TreeCtrl.ScreenToClient(&point); //轉(zhuǎn)化成客戶坐標(biāo)
hTree = m_TreeCtrl.HitTest(point,&uFlag); //返回與CtreeTtrl關(guān)聯(lián)的光標(biāo)的當(dāng)前位置和句柄
if((TVHT_NOWHERE & uFlag))
{
return;
}
if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //點(diǎn)中復(fù)選框
{
m_TreeCtrl.SelectItem(hTree);
CString temp = m_TreeCtrl.GetItemText(hTree) + "\r\n";
TRACE(temp);
bCheck = m_TreeCtrl.GetCheck(hTree); //獲取當(dāng)前復(fù)選狀態(tài)
SetChildCheck(hTree,!bCheck); //設(shè)置子項(xiàng)復(fù)選狀態(tài)
SetParentCheck(hTree, bCheck); //設(shè)置父項(xiàng)復(fù)選狀態(tài)
}
*pResult = 0;
}
void CTestTimerDlg::SetChildCheck(HTREEITEM hTree,BOOL bCheck)
{
m_TreeCtrl.Expand(hTree,TVE_EXPAND);
hTree = m_TreeCtrl.GetChildItem(hTree); //獲取子項(xiàng)句柄
while (hTree)
{
m_TreeCtrl.SetCheck(hTree, bCheck);
SetChildCheck(hTree,bCheck); //遞歸調(diào)用
hTree = m_TreeCtrl.GetNextSiblingItem(hTree); //獲取兄弟的句柄
}
}
void CTestTimerDlg::SetParentCheck(HTREEITEM hTree,BOOL bCheck)
{
HTREEITEM hParent = m_TreeCtrl.GetParentItem(hTree);
if (hParent)
{
HTREEITEM hChild = m_TreeCtrl.GetChildItem(hParent);
while (hChild)
{
if (hChild == hTree)
{
hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
continue;
}
BOOL bflag = m_TreeCtrl.GetCheck(hChild);
if (bCheck == bflag) //判斷是否還有兄弟項(xiàng)被選擇
{
return;
}
hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
}
m_TreeCtrl.SetCheck(hParent,!bCheck);
SetParentCheck(hParent,bCheck); //設(shè)置父項(xiàng)的狀態(tài)
}
上一篇:C++中MFC Tab Control控件的使用詳解
欄 目:C語言
下一篇:C++實(shí)現(xiàn)的鏈表類實(shí)例
本文標(biāo)題:C++ CTreeview的checkbox使用方法
本文地址:http://m.jygsgssxh.com/a1/Cyuyan/3050.html
您可能感興趣的文章
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10c語言求1+2+...+n的解決方法
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10c語言 跳臺階問題的解決方法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什


