c++ - 如何快速制作只有两层的宽虚拟 TreeView 控件?

标签 c++ winapi mfc treeview treecontrol

我基本上希望获得与 ListView 控件相同的虚拟性能。使用 List-View 控件,您可以设置 ItemCount 并在 LVN_GETDISPINFO 通知中填写项目滚动可见时的信息。

现在,Tree-View 提供的虚拟功能适用于非常深的树,因此您只能在节点展开后添加项目(通过 TVN_ITEMEXPANDING),而 TVN_GETDISPINFO 可用于在项目滚动后填充项目信息可见的。但是,如果您有一个“始终展开”的两级树(仅用于设计问题),TVN_ITEMEXPANDING 将没有任何用处,并且只想在项目可见时添加它们,该怎么办。问题是,没有 SetItemCount() 之类的东西或类似的东西来调整树的大小。

在我的例子中,项目信息(文本、图像、选定图像)的填充不是昂贵的部分,但项目的插入(全部在一个级别)是。

一种选择是只插入可见的项目和一个不可见的项目,一旦不可见的项目变得可见(在 TVN_GETDISPINFO 中检测到),我会插入更多项目,依此类推。但是滚动条总是越向下滚动越小,我觉得这很奇怪。

除了绘制自己的控件之外,还有其他想法可以实现我想要的吗?

整棵树看起来就像这样,几乎是一个列表,只是我喜欢树的样子。

RootNode
|
|--Item 1
|--Item 2
|--Item 3
|--Item 4
|--Item 5
|--Item 6
|--Item 7
...
|__Item 1000

最佳答案

如许多其他帖子所述, TreeView 控件真正昂贵的部分是使用 InsertItemDeleteItem。提高这些操作性能的一种快速方法是使用 SetRedraw。它不仅隐藏了闪烁,而且确实加快了速度,因为绘图似乎很昂贵 - 尽管使用了 TVN_GETDISPINFO

此外,重命名现有项目并更改其数据比删除和添加新项目更快。因此,当我有一个大列表并且知道下一次更新将包含大约相同数量的 +/- 几个时,我会遍历这些项目,重命名它们,更改它们的 lparams 并同步(即删除/添加)其余的根据新数据。根据列表的大小,进行这些额外的计算可以显着提高性能。

关于c++ - 如何快速制作只有两层的宽虚拟 TreeView 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17334272/

相关文章:

c++ - 对 libuv 的来源有一些疑问吗?

winapi - 有谁知道advapi代表什么?

c++ - 为什么 WinAPI 对 BOOL 类型使用 int(32 位)?

c++ - 相当于 Direct2D 中的 GDI 笔

c++ - 创建一个将另一个 CMap 作为值的 CMap

c++ - 在 Ruby 中调用 C++ 共享库

c++ - cin - 读取加/减为 char

c++ - 我缺少什么?

Windows 资源管理器外壳扩展 : create file and enter "rename" mode

MFC 菜单项未正确调用模式对话框