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會(huì)引發(fā)NM_CLICK事件。若點(diǎn)擊CHECKBOX則傳遞TVHT_ONITEMSTATEICON。
因此可不處理TVN_SELCHANGED事件而只處理NM_CLICK事件。
3. 消息處理注意事項(xiàng)
(1)點(diǎn)擊CHECKBOX后會(huì)自動(dòng)更新CheckBox的狀態(tài),因此在處理代碼中不需要使用SetCheck函數(shù)設(shè)置狀態(tài),而GetCheck函數(shù)返回也是其原始狀態(tài)。
(2)點(diǎn)擊新CHECKBOX后不會(huì)自動(dòng)將對(duì)應(yīng)的ITEM設(shè)置為選擇狀態(tài),需要使用SelectItem函數(shù)進(jìn)行設(shè)置。
4. 使用方法
(1)若傳遞TVHT_ONITEMSTATEICON
獲取選擇ITEM的狀態(tài)并取反
若有子項(xiàng)則所有子項(xiàng)設(shè)置為一致
若沒(méi)有子項(xiàng)則
若當(dāng)前狀態(tài)為T(mén)RUE則設(shè)置父項(xiàng)為T(mén)RUE;否則遍歷所有兄弟項(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è)置為一致
若沒(méi)有子項(xiàng)則
若當(dāng)前狀態(tài)為T(mén)RUE則設(shè)置父項(xiàng)為T(mén)RUE;否則遍歷所有兄弟項(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)擊測(cè)試的信息的整數(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) }
相關(guān)文章
C語(yǔ)言中switch語(yǔ)句基本用法實(shí)例
switch的中文翻譯是開(kāi)關(guān),顧名思義,開(kāi)關(guān)的作用就是控制連通或者中斷,在C語(yǔ)言中switch語(yǔ)句的作用也是大同小異,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中switch語(yǔ)句基本用法的相關(guān)資料,需要的朋友可以參考下2022-07-07C語(yǔ)言學(xué)習(xí)之關(guān)鍵字的示例詳解
關(guān)鍵字,這名字一聽(tīng),就很關(guān)鍵。而有些關(guān)鍵字,你可能不是很了解,更別談使用。所以,這篇文章將帶你見(jiàn)識(shí)常見(jiàn)的關(guān)鍵字,一起領(lǐng)略它們的風(fēng)采吧2022-10-10利用Matlab實(shí)現(xiàn)迭代適應(yīng)點(diǎn)算法
道格拉斯-普克算法(Douglas–Peucker?algorithm,亦稱為拉默-道格拉斯-普克算法、迭代適應(yīng)點(diǎn)算法、分裂與合并算法)是將曲線近似表示為一系列點(diǎn),并減少點(diǎn)的數(shù)量的一種算法。本文將利用Matlab實(shí)現(xiàn)這一算法,需要的可以參考一下2022-04-04C語(yǔ)言 自增自減運(yùn)算的區(qū)別詳解及實(shí)例
這篇文章主要介紹了C語(yǔ)言中的++a和a++的區(qū)別詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05C語(yǔ)言中g(shù)etchar函數(shù)詳解看這一篇就夠了(函數(shù)功能、使用、返回值)
getchar讀取字符的函數(shù),今天通過(guò)本文給大家介紹C語(yǔ)言中g(shù)etchar函數(shù)簡(jiǎn)介用法示例詳解,感興趣的朋友跟隨小編一起看看吧2023-02-02總結(jié)UNIX/LINUX下C++程序計(jì)時(shí)的方法
本文總結(jié)了下UNIX/LINUX下C++程序計(jì)時(shí)的一些函數(shù)和方法,對(duì)日常使用C++程序的朋友很有幫助,有需要的小伙伴們可以參考學(xué)習(xí),下面一起來(lái)看看吧。2016-08-08