Mfc DrawItem()方法重复执行

Mfc DrawItem()方法重复执行,mfc,listbox,Mfc,Listbox,我在从CListBox派生的CMyListBox类上使用了所有者绘制的策略。我只希望在列表框中插入项时执行DrawItem()方法。但是该方法被多次调用。如何更改以在需要时调用它。只要需要在列表框中绘制任何给定项,就会调用DrawItem()方法。如果不响应,则列表框中可能会出现一个空白区域,其中绘制的数据已被擦除,但尚未刷新。如果你真的认为没有必要画图,你可以这样做 void CMyListBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ) {

我在从CListBox派生的CMyListBox类上使用了所有者绘制的策略。我只希望在列表框中插入项时执行DrawItem()方法。但是该方法被多次调用。如何更改以在需要时调用它。

只要需要在列表框中绘制任何给定项,就会调用DrawItem()方法。如果不响应,则列表框中可能会出现一个空白区域,其中绘制的数据已被擦除,但尚未刷新。如果你真的认为没有必要画图,你可以这样做

void CMyListBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
   if (!m_DrawingEnabled)
     return;
}

如果m_DrawingEnabled是您维护的用于停止不必要绘制的成员,

您始终可以通过将内容输出到内存中的位图,然后绘制来缓存初始绘制,这确实意味着您需要跟踪更改的时间,以便重新运行实际的渲染代码。如果渲染代码太多,它确实可以节省每次运行渲染代码的时间。

我完全按照Kieron的建议缓存位图,但是仅在非常昂贵的渲染代码中运行。实际上,我必须保留多个缓存的“状态”,这取决于项目是否高亮显示、禁用、正常等(这是针对工具栏按钮,而不是listitem,但我认为它适用)。我只在第一次需要时缓存预渲染图像-这样我只缓存我实际需要的“状态”

我的画是纯粹的GDI调用。大部分是位图操作和其他只需要时间的绘图,加上我经常被重画(没有什么好的理由——说来话长)

改变我所使用的框架(MFC和Stingray)的基本原理不是一个选项。在所有其他优化都不够好(该死的慢虚拟机!!)之后,缓存是最后的选择

通常情况下,绘图速度足以在无效时完成(在本例中为DrawItem)。我想看看你在DrawItem里到底在做什么。我将研究渲染所需的缓存数据和计算,而不是渲染本身(如最终位图),除非没有其他选项


此外,我还了解到Vista渲染更加优化,它们会缓存您在窗口上绘制的内容,以减少包含无效/重画周期,例如,当一个窗口从另一个窗口后面移动时。

您认为什么时候会调用DrawItem,而实际上不需要重新渲染它?例如,我只想在将新项目添加到列表框后绘制它,或者删除列表框中的某个项目。但是当我改变列表框的大小时,我不想画它。如果windows要求重画它,我不认为标志会有帮助,因为它很可能需要画。添加一个标志将不会显示任何内容。它不会保留以前绘制的内容。缓存中间计算对我的情况确实有很大帮助。