列表视图控件会丢失具有大量列的性能

时间:2012-05-18 10:40:39

标签: c++ winapi listview wtl

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

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

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

2 个答案:

答案 0 :(得分:1)

ListView的实现方式就是这样。我想到了以下优化:

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

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

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

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

答案 1 :(得分:0)

我当然不是这方面的专家,但您可能需要查看MSDN中的LVN_ODCACHEHINT Notification Code