如何使CTreeCtrl :: Expand不改变项目位置?

时间:2014-03-17 01:26:11

标签: c++ user-interface mfc

我们知道CTreeCtrl的TVS_HASBUTTONS样式可以在项目之前显示“+”或“ - ”。我想设置两个图标(一个用于关闭,一个用于打开)而不是默认的“+”和“ - ”,因此我没有使用TVS_HASBUTTONS样式。为了实现“+”和“ - ”的功能,我已经覆盖了鼠标左键处理程序的图标点击事件,并调用了CTreeCtrl :: Expand里面。但是我发现Expand方法会改变CTreeCtrl中的项目位置,但是“+”和“ - ”不会。任何解决方案?

void CMyTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    UINT uFlags;
    HTREEITEM hItem = HitTest(point, &uFlags); 
    CRect Rect,IconRect;

    if (hItem != NULL)
    {
        if (GetItemRect(hItem,&Rect,TRUE))
        {
            IconRect.left = Rect.left - 16;
            IconRect.right = Rect.left;
            IconRect.top   = Rect.top;
            IconRect.bottom = Rect.bottom;

            if (IconRect.PtInRect(point))
            {
                Expand(hItem, TVE_TOGGLE);
            }
            else
            {
                //MyMessageBox_Error(_T("not icon"));
            }
        }
    }

    CTreeCtrlDrag::OnLButtonDown(nFlags, point);
}

1 个答案:

答案 0 :(得分:0)

展开时,不应调用默认的OnLButtonDown处理程序。这将更改选定的项目成员。

扩展后返回。试想一下,完成扩展后,您的点击操作就完成了。你不想要任何进一步的行动......

只是一种不同的方法:

当它只是关于不同的符号时,比使用所有者绘制或自定义绘制树控件。比你不需要模拟其余的控制动作,你仍然可以使用 TVS_HASBUTTONS。