我在CMyListBox类上使用了所有者绘制的策略,该策略派生自CListBox。我只想在列表框中插入项目时执行DrawItem()方法。但是该方法被多次调用。如何在需要时更改为调用它。
答案 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是您保持停止不必要绘制的成员,