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

发布于 2024-08-12 17:51:02 字数 270 浏览 11 评论 0原文

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

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

有什么想法吗?

I'm using a ListView control in virtual and OwnerDraw mode to display a number of items.
Is there a way to test whether a certain item is visible (within the client area of the control) without triggering a draw event or a RetrieveVirtualItem event?

The problem is, I have a background thread that periodically adds more items to the listview. But for some reason, every time I add more items (increment VirtualListSize), it triggers a RetrieveVirtualItem for the last item added, even though it's nowhere near the visible range.
And, of course, I only want to draw items that are actually visible.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吹梦到西洲 2024-08-19 17:51:03

在虚拟列表上,Windows 在许多奇怪的地方触发 RetrieveVirtualItem 事件,而且这些事件在 XP、Vista 和 Win7 之间是不同的。业主绘制的虚拟列表是最糟糕的。

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

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

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

On virtual lists, Windows fires RetrieveVirtualItem events in many strange places -- and they are different between XP, Vista and Win7. Owner drawn virtual lists are the worst.

If your goal is to reduce the number of RetrieveVirtualItem events, you are out of luck.

If your goal is to reduce the number of redraws necessary for your OwnerDrawn rows, you will be better off optimizing the redrawing more directly. For example, you can capture the rectangle of the damaged region in the WM_PAINT event, and then use that in your subitem drawing method to determine if that subitem was damaged.

Or you could use ObjectListView -- an open source wrapper around a .NET WinForms ListView -- that has already dealt with this problem. If you are going to allow horizontal scrolling AND column rearranging, you really do want to use an ObjectListView -- for reasons explained here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文