DrawItem()方法重复执行

时间:2008-10-29 11:55:48

标签: mfc listbox

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

3 个答案:

答案 0 :(得分:1)

您总是可以通过将内容输出到内存中的位图来缓存初始绘图,然后绘制它,它确实意味着您需要跟踪某些内容何时发生更改,以便您可以运行实际的rending代码。如果有大量的渲染代码,它确实可以节省渲染代码的运行时间。

答案 1 :(得分:1)

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

我的绘图是纯粹的GDI调用。大多数位图操作和其他绘图只需要时间,而且我经常被重绘(没有充分的理由 - 长篇故事)。

在我使用的框架(MFC和Stingray)中更改基础知识不是一个选择。在所有其他优化措施都不够好之后,缓存是最后的手段(该死的慢虚拟机!!)。

正常情况下,当你失效时,绘图足够快(在这种情况下为DrawItem)。我想看看你在DrawItem中究竟做了什么。我将研究渲染所需的缓存数据和计算,以及渲染本身(例如最终位图),除非没有其他选项。

另外,我读到Vista更新更优化了,它们会缓存你在窗口上绘制的内容,以减少包含无效/重绘周期,例如,当一个窗口从另一个窗口移开时。

答案 2 :(得分:0)

只要需要在列表框中绘制任何给定项目,就会调用DrawItem()方法。如果您没有回复它,您可能会在列表框中看到一个空白区域,其中已绘制的数据已被删除且您尚未刷新它。如果你真的不认为绘图是必要的,你可以做类似的事情

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

其中m_DrawingEnabled是您保持停止不必要绘制的成员,