给CTreeCtrl控件设置复选框属性以后,如何实现选中根节点以后,让该根节点的所有子节点默认全部选中?然后只要有至少1个子节点没有被选中,根节点就设置为非选中状态?

解决方案 »

  1.   

    子类化,然后重载OnLButtonDown,用HitTest进行判断。这里需要判断一下哪个项给选中了,然后用递归算法确定如何做。HTREEITEM HitTest( 
    CPoint pt, 
    UINT* pFlags = NULL ) 
    const; HTREEITEM HitTest( 
    TVHITTESTINFO* pHitTestInfo ) 
    const; 给出部分实例代码如下,后继我可能会专门写文章公开整个自定义TreeCtrl的代码:
    void CTreeEx::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default

    BOOL bCheck;
    HTREEITEM hItem = HitTest(point, &nFlags);
    if (NULL == hItem)
    {
    return;
    }
    else
    {
    bCheck = GetCheck(hItem);
    }

    CTreeCtrl::OnLButtonDown(nFlags, point);

    if (bCheck != GetCheck(hItem))
    {
    if (hItem != NULL)
    {
    SelectItem(hItem);
    UpdateCheck(hItem); // 更新整个Tree的选择状态
    }
    }
    }
      

  2.   

    补充说明一下:UpdateCheck是我自己定义的递归函数,用来更新整个Tree的选择状态。
      

  3.   

    你的意思是说首先判断鼠标点击区域,然后判断如何更新Tree,这样应该可以实现。
    有没有类似于CButtonST一样,封装好了的类,直接调用就可以实现上述功能的啊?