我们知道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);
}
答案 0 :(得分:0)
展开时,不应调用默认的OnLButtonDown处理程序。这将更改选定的项目成员。
扩展后返回。试想一下,完成扩展后,您的点击操作就完成了。你不想要任何进一步的行动......
只是一种不同的方法:
当它只是关于不同的符号时,比使用所有者绘制或自定义绘制树控件。比你不需要模拟其余的控制动作,你仍然可以使用 TVS_HASBUTTONS。