测试项目是否在虚拟ListView中可见

时间:2009-12-02 14:36:28

标签: .net listview ownerdrawn

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

问题是,我有一个后台线程,定期向listview添加更多项目。但由于某种原因,每次我添加更多项目(增量VirtualListSize)时,它会为最后添加的项目触发RetrieveVirtualItem,即使它不在可见范围附近。 当然,我只想绘制实际可见的项目。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在虚拟列表中,Windows在许多奇怪的地方发起RetrieveVirtualItem事件 - 它们在XP,Vista和Win7之间是不同的。所有者绘制的虚拟列表是最差的。

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

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

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