如何使CTreeCtrl::展开不改变项目的位置
How to make CTreeCtrl::Expand not change the item positions?
我们知道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 .
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- 变量没有改变?通过向量的函数调用
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 为什么我的矢量中的项目在 C++ 中的 for-each 循环期间不会改变?
- Qt c++:如何在新项目打开后改变布局
- 如何改变默认#包括在Visual Studio 2013(c++)中,当我创建一个新项目
- 如何使CTreeCtrl::展开不改变项目的位置