我在报告模式下有一个虚拟列表视图控件,我通过处理NM_CUSTOMDRAW通知手动绘制其项目。我遇到的问题是我的性能与列数成比例下降。通过调试代码,我注意到我的OnCustomDraw和OnGetDispInfo被调用用于在客户端窗口中甚至看不到的项目。
如果我有一个包含1.000行和100列的列表视图,其中只有10行和5列可见,我注意到将为这10行中的每个元素调用OnCustomDraw和OnGetDispInfo。 Listview将向我发送所有95个不可见的列的通知。
有人遇到过这样的问题吗?
答案 0 :(得分:1)
ListView的实现方式就是这样。我想到了以下优化:
通过控制子类,跟踪可见列的列表。在列表视图子类proc中,您可能需要处理以下消息(如果我忘记了某些消息,可能会更多):
每当有任何这些消息出现时,让原始proc处理它,然后更新当前可见列的列表(参见HDM_GETITEMRECT)。
在对话框/窗口过程中处理NM_CUSTOMDRAW时,请查看可见列的列表,并仅在可见时进行绘制。
答案 1 :(得分:0)
我当然不是这方面的专家,但您可能需要查看MSDN中的LVN_ODCACHEHINT Notification Code
。