0

我基本上希望获得与 List-View 控件相同的虚拟性能。使用 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
4

2 回答 2

2

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

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

于 2013-07-01T02:18:13.987 回答
1

Win32 TreeView 控件不支持您正在寻找的那种虚拟模式。所以你需要一个自定义控件。

于 2013-06-27T08:37:52.813 回答