0

我在虚拟和 OwnerDraw 模式下使用 ListView 控件来显示许多项目。有没有办法在不触发绘图事件或 RetrieveVirtualItem 事件的情况下测试某个项目是否可见(在控件的客户区域内)?

问题是,我有一个后台线程,它会定期向列表视图添加更多项目。但是由于某种原因,每次我添加更多项目(增加 VirtualListSize)时,它都会为最后添加的项目触发 RetrieveVirtualItem,即使它远未接近可见范围。而且,当然,我只想绘制实际可见的项目。

有任何想法吗?

4

1 回答 1

0

在虚拟列表上,WindowsRetrieveVirtualItem在许多奇怪的地方触发事件——它们在 XP、Vista 和 Win7 之间是不同的。所有者绘制的虚拟列表是最差的。

如果您的目标是减少RetrieveVirtualItem事件的数量,那么您就不走运了。

如果您的目标是减少OwnerDrawn行所需的重绘次数,则最好更直接地优化重绘。例如,您可以在WM_PAINT事件中捕获损坏区域的矩形,然后在您的子项绘制方法中使用它来确定该子项是否已损坏。

或者您可以使用ObjectListView——一个围绕 .NET WinForms ListView 的开源包装器——它已经解决了这个问题。如果您打算允许水平滚动和列重新排列,那么您确实想要使用 ObjectListView——原因解释在这里

于 2009-12-08T13:41:41.953 回答