我基本上希望使用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
答案 0 :(得分:2)
正如许多其他帖子所述,关于Tree-View控件的真正昂贵的部分是使用InsertItem
和DeleteItem
。提高这些操作性能的一种快速方法是使用SetRedraw
。它不仅隐藏了闪烁,而且确实加快了速度,因为绘图看起来很昂贵 - 即使使用了TVN_GETDISPINFO
。
此外,重命名现有项目并更改其数据而不是删除和添加新项目更快。因此,当我有一个大清单并且知道下一个更新将包含大约相同数量+/-几个时,我会遍历这些项目,重命名它们,更改它们的lparams并同步(即删除/添加)剩余的项目根据新数据。根据列表的大小,进行这些额外的计算可以带来巨大的性能提升。
答案 1 :(得分:0)
Win32 TreeView控件不支持您要查找的虚拟模式。所以你需要一个自定义控件。