CTreeCtrl中的根节点被选中则子树全选或全清

      今天,我用CTreeCtrl创建一树形结构,想在点根节点时,则其下的所有子树全部被选中或者全情。我找到了两种方法来实现这一功能:

      第一种方法,就是重载CTreeCtrl下的OnLbuttonDown(UINT nFlags, CPoint point)方法,如下所示:

  1. void CTreeCtrlCh::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.     bool bCheck ;
  4.           //找到所点击的节点位置
  5.     HTREEITEM hItem = HitTest(point, &nFlags) ;
  6.     if (hItem == NULL)
  7.     {
  8.         return ;
  9.     }
  10.     CTreeCtrl::OnLButtonDown(nFlags, point) ;
  11.     bCheck = GetCheck(hItem) ;
  12.          //根节点
  13.     HTREEITEM hRoot = GetRootItem() ;
  14.           //如果所选节点就是根节点
  15.     if (hRoot == hItem)
  16.     {        //如果节点状态==true,则其下子树全是选中状态
  17.         if (bCheck)
  18.         {
  19.             hRoot = GetChildItem(hRoot) ;
  20.             while (hRoot != NULL)
  21.             {
  22.                 SetCheck(hRoot, TRUE) ;
  23.                 hRoot = GetNextItem(hRoot, TVGN_NEXT) ;
  24.             }
  25.         }
  26.         else
  27.         {
  28.                       //否则,子树全清
  29.             hRoot = GetChildItem(hRoot) ;
  30.             while (hRoot != NULL)
  31.             {
  32.                 SetCheck(hRoot, FALSE) ;
  33.                 hRoot = GetNextItem(hRoot, TVGN_NEXT) ;
  34.             }
  35.         }
  36.     }
  37. }

 

      第二种方法:添加CTreeCtrl的NM_CLICK单击事件,然后在其事件中进行处理,我的Tree包括了“Has buttons”,“Has lines”,“Lines at root”,所以在事件要对“根节点打开”和”checkbox选中“的操作做出判断,然后在进行子树的全选或全清,示例代码如下所示:

   

  1. void CDlgPerfPut::OnClickPutPerfTree(NMHDR* pNMHDR, LRESULT* pResult) 
  2. {
  3.     BOOL bCheck ;
  4.     TVHITTESTINFO ht ;
  5.     
  6.     GetCursorPos(&ht.pt) ;
  7.     m_wndTree.ScreenToClient(&ht.pt) ;
  8.     ht.flags = TVHT_ABOVE ;
  9.     
  10.          //获取鼠标点击的节点的消息
  11.     HTREEITEM hItem = m_wndTree.HitTest(&ht) ;
  12.     if (hItem == NULL)
  13.     {
  14.         return ;
  15.     }
  16.     
  17.     HTREEITEM hRoot = m_wndTree.GetRootItem() ;
  18.          //选中树的checkbox
  19.     if (ht.flags & TVHT_ONITEMSTATEICON)
  20.     {
  21.               //根节点
  22.          if (hItem == hRoot)
  23.           {
  24.         bCheck = m_wndTree.GetCheck(hRoot) ;
  25.                   //根节点被选中
  26.         if (!bCheck)
  27.         {
  28.              hItem = m_wndTree.GetChildItem(hRoot) ;
  29.              while (hItem != NULL)
  30.              {
  31.                 m_wndTree.SetCheck(hItem, TRUE) ;
  32.                 hItem = m_wndTree.GetNextItem(hItem, TVGN_NEXT) ;
  33.               }
  34.          }
  35.          else
  36.          {
  37.              hItem = m_wndTree.GetChildItem(hRoot) ;
  38.              while (hItem != NULL)
  39.                   {
  40.                            m_wndTree.SetCheck(hItem, FALSE) ;
  41.                  hItem = m_wndTree.GetNextItem(hItem, TVGN_NEXT) ;
  42.               }
  43.           }
  44.         }
  45.       }
  46.     
  47.     *pResult = 0;
  48. }

        以上就是我想到的两种方法了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值