今天,我用CTreeCtrl创建一树形结构,想在点根节点时,则其下的所有子树全部被选中或者全情。我找到了两种方法来实现这一功能:
第一种方法,就是重载CTreeCtrl下的OnLbuttonDown(UINT nFlags, CPoint point)方法,如下所示:
- void CTreeCtrlCh::OnLButtonDown(UINT nFlags, CPoint point)
- {
- bool bCheck ;
- //找到所点击的节点位置
- HTREEITEM hItem = HitTest(point, &nFlags) ;
- if (hItem == NULL)
- {
- return ;
- }
- CTreeCtrl::OnLButtonDown(nFlags, point) ;
- bCheck = GetCheck(hItem) ;
- //根节点
- HTREEITEM hRoot = GetRootItem() ;
- //如果所选节点就是根节点
- if (hRoot == hItem)
- { //如果节点状态==true,则其下子树全是选中状态
- if (bCheck)
- {
- hRoot = GetChildItem(hRoot) ;
- while (hRoot != NULL)
- {
- SetCheck(hRoot, TRUE) ;
- hRoot = GetNextItem(hRoot, TVGN_NEXT) ;
- }
- }
- else
- {
- //否则,子树全清
- hRoot = GetChildItem(hRoot) ;
- while (hRoot != NULL)
- {
- SetCheck(hRoot, FALSE) ;
- hRoot = GetNextItem(hRoot, TVGN_NEXT) ;
- }
- }
- }
- }
第二种方法:添加CTreeCtrl的NM_CLICK单击事件,然后在其事件中进行处理,我的Tree包括了“Has buttons”,“Has lines”,“Lines at root”,所以在事件要对“根节点打开”和”checkbox选中“的操作做出判断,然后在进行子树的全选或全清,示例代码如下所示:
- void CDlgPerfPut::OnClickPutPerfTree(NMHDR* pNMHDR, LRESULT* pResult)
- {
- BOOL bCheck ;
- TVHITTESTINFO ht ;
- GetCursorPos(&ht.pt) ;
- m_wndTree.ScreenToClient(&ht.pt) ;
- ht.flags = TVHT_ABOVE ;
- //获取鼠标点击的节点的消息
- HTREEITEM hItem = m_wndTree.HitTest(&ht) ;
- if (hItem == NULL)
- {
- return ;
- }
- HTREEITEM hRoot = m_wndTree.GetRootItem() ;
- //选中树的checkbox
- if (ht.flags & TVHT_ONITEMSTATEICON)
- {
- //根节点
- if (hItem == hRoot)
- {
- bCheck = m_wndTree.GetCheck(hRoot) ;
- //根节点被选中
- if (!bCheck)
- {
- hItem = m_wndTree.GetChildItem(hRoot) ;
- while (hItem != NULL)
- {
- m_wndTree.SetCheck(hItem, TRUE) ;
- hItem = m_wndTree.GetNextItem(hItem, TVGN_NEXT) ;
- }
- }
- else
- {
- hItem = m_wndTree.GetChildItem(hRoot) ;
- while (hItem != NULL)
- {
- m_wndTree.SetCheck(hItem, FALSE) ;
- hItem = m_wndTree.GetNextItem(hItem, TVGN_NEXT) ;
- }
- }
- }
- }
- *pResult = 0;
- }
以上就是我想到的两种方法了。