C++ CTreeview的checkbox應用辦法。本站提示廣大學習愛好者:(C++ CTreeview的checkbox應用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ CTreeview的checkbox應用辦法正文
1. 新聞事宜
(1)鼠標點擊以後ITEM的CHECKBOX:激發NM_CLICK事宜並傳遞TVHT_ONITEMSTATEICON。
(2)鼠標點擊以後ITEM的TEXT:激發NM_CLICK事宜。
(3)鼠標點擊新ITEM的CHECKBOX:激發TVN_SELCHANGED事宜、NM_CLICK事宜並傳遞TVHT_ONITEMSTATEICON。
(4)鼠標點擊新ITEM的TEXT:激發NM_CLICK事宜、TVN_SELCHANGED事宜。
2. 新聞事宜總結
點擊ITEM會激發NM_CLICK事宜。若點擊CHECKBOX則傳遞TVHT_ONITEMSTATEICON。
是以可不處置TVN_SELCHANGED事宜而只處置NM_CLICK事宜。
3. 新聞處置留意事項
(1)點擊CHECKBOX後會主動更新CheckBox的狀況,是以在處置代碼中不須要應用SetCheck函數設置狀況,而GetCheck函數前往也是其原始狀況。
(2)點擊新CHECKBOX後不會主動將對應的ITEM設置為選擇狀況,須要應用SelectItem函數停止設置。
4. 應用辦法
(1)若傳遞TVHT_ONITEMSTATEICON
獲得選擇ITEM的狀況並取反
如有子項則一切子項設置為分歧
若沒有子項則
若以後狀況為TRUE則設置父項為TRUE;不然遍歷一切兄弟項,若全為FALSE則設置父項為FALSE。
若選擇了新ITEM則設置新ITEM為選擇項
(2)若未傳遞TVHT_ONITEMSTATEICON
設置更新ITEM狀況,獲得選擇ITEM的狀況
如有子項則一切子項設置為分歧
若沒有子項則
若以後狀況為TRUE則設置父項為TRUE;不然遍歷一切兄弟項,若全為FALSE則設置父項為FALSE。
5. 呼應NM_CLICK事宜的函數代碼
void CTestTimerDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint point;
UINT uFlag; //吸收有關點擊測試的信息的整數
HTREEITEM hTree;
BOOL bCheck;
GetCursorPos(&point); //獲得屏幕鼠標坐標
m_TreeCtrl.ScreenToClient(&point); //轉化成客戶坐標
hTree = m_TreeCtrl.HitTest(point,&uFlag); //前往與CtreeTtrl聯系關系的光標確當前地位和句柄
if((TVHT_NOWHERE & uFlag))
{
return;
}
if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //點中復選框
{
m_TreeCtrl.SelectItem(hTree);
CString temp = m_TreeCtrl.GetItemText(hTree) + "\r\n";
TRACE(temp);
bCheck = m_TreeCtrl.GetCheck(hTree); //獲得以後復選狀況
SetChildCheck(hTree,!bCheck); //設置子項復選狀況
SetParentCheck(hTree, bCheck); //設置父項復選狀況
}
*pResult = 0;
}
void CTestTimerDlg::SetChildCheck(HTREEITEM hTree,BOOL bCheck)
{
m_TreeCtrl.Expand(hTree,TVE_EXPAND);
hTree = m_TreeCtrl.GetChildItem(hTree); //獲得子項句柄
while (hTree)
{
m_TreeCtrl.SetCheck(hTree, bCheck);
SetChildCheck(hTree,bCheck); //遞歸挪用
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) //斷定能否還有兄弟項被選擇
{
return;
}
hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
}
m_TreeCtrl.SetCheck(hParent,!bCheck);
SetParentCheck(hParent,bCheck); //設置父項的狀況
}