C++ CTreeview的checkbox使用方法
1. 消息事件 (1)鼠标点击当前ITEM的CHECKBOX:引发NM_CLICK事件并传递TVHT_ONITEMSTATEICON。 2. 消息事件总结 点击ITEM会引发NM_CLICK事件。若点击CHECKBOX则传递TVHT_ONITEMSTATEICON。 3. 消息处理注意事项 (1)点击CHECKBOX后会自动更新CheckBox的状态,因此在处理代码中不需要使用SetCheck函数设置状态,而GetCheck函数返回也是其原始状态。 4. 使用方法 (1)若传递TVHT_ONITEMSTATEICON 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) + "rn"; 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); //设置父项的状态 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |