如何使CTreeCtrl::展开不改变项目的位置

How to make CTreeCtrl::Expand not change the item positions?

本文关键字:项目 改变 位置 何使 CTreeCtrl      更新时间:2023-10-16

我们知道CTreeCtrl的TVS_HASBUTTONS样式可以在项前显示"+"或"-"。我想设置两个图标(一个用于关闭,一个用于打开),而不是默认的"+"answers"-",所以我没有使用TVS_HASBUTTONS样式。为了实现"+"answers"-"的功能,我覆盖了图标单击事件的鼠标左下处理程序,并在其中调用了CTreeCtrl::Expand。但是我发现Expand方法会改变CTreeCtrl中的项目位置,但是"+"answers"-"不会。有解决方案吗?

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);
}

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

在展开后返回。只要认为在你完成了扩展之后,你的点击操作就完成了。你不想要任何进一步的行动…

只是一个不同的方法:

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