2

我在报告模式下有一个虚拟列表视图控件,我通过处理 NM_CUSTOMDRAW 通知手动绘制其项目。我遇到的问题是我的性能下降与列数成正比。通过调试代码,我注意到我的 OnCustomDraw 和 OnGetDispInfo 被调用用于在客户端窗口中甚至不可见的项目。

如果我有一个包含 1.000 行和 100 列的列表视图,其中只有 10 行和 5 列可见,我注意到将为这 10 行中的每个元素调用 OnCustomDraw 和 OnGetDispInfo。Listview 将向我发送所有不可见的 95 列的通知。

有没有人遇到过这样的问题?

4

2 回答 2

1

ListView 是按原样实现的。我想到了以下优化:

通过控件子类化,跟踪可见列的列表。在列表视图子类 proc 中,您可能需要处理以下消息(如果我忘记了可能会更多):

  • WM_CREATE
  • WM_SIZE
  • WM_HSCROLL
  • WM_NOTIFY (if ((NMHDR*)lParam)->hwndFrom 来自嵌入式标头控件;请参阅 LVM_GETHEADER 的文档)

每当这些消息出现时,让原始 proc 处理它,然后更新当前可见列的列表(请参阅 HDM_GETITEMRECT)。

在对话框/窗口过程中处理 NM_CUSTOMDRAW 时,请查阅可见列列表并仅在可见时绘制。

于 2012-05-18T12:26:30.647 回答
0

我当然不是这方面的专家,但也许你必须LVN_ODCACHEHINT Notification Code在 MSDN 中查看。

于 2012-05-18T13:09:32.873 回答