我在从CListBox派生的CMyListBox类上使用了所有者描述的策略。我只希望在列表框中插入项时执行DrawItem()方法。但是该方法被多次调用。我如何才能在需要时更改为调用它。
发布于 2008-10-29 12:13:29
你可以通过将内容输出到内存中的位图来缓存初始绘图,然后绘制它,这意味着你需要跟踪什么时候发生了变化,这样你就可以立即运行实际的渲染代码。如果有大量的渲染代码,它确实可以节省每次运行渲染代码的时间。
发布于 2008-10-29 13:14:04
我完全按照Kieron的建议缓存了位图,但是只在非常昂贵的渲染代码中使用。实际上,我必须保留多个缓存的“状态”,这取决于项目是否突出显示、禁用、正常等(这是用于工具栏按钮,而不是列表项-但我认为它适用)。我只在第一次需要的时候缓存预渲染的图像--这样我只缓存我真正需要的“状态”。
我的绘图是纯GDI调用。大部分是位图操作和其他绘图,只是需要时间,加上我被重绘的次数太多了(没有充分的理由-说来话长)。
在我使用的框架(MFC和Stingray)中改变基本原理是不可行的。在所有其他优化都不够好(该死的慢虚拟机!!)之后,缓存是最后的手段。
通常情况下,当您被无效时(在本例中为DrawItem),绘制速度已经足够快了。我会看看你在DrawItem里到底在做什么。我会研究渲染和所需要的缓存数据和计算,而不是渲染本身(例如最终的位图),除非没有其他选择。
另外,我读到Vista渲染更优化,他们缓存你在你的窗口上绘制的内容,以减少包含无效/重绘周期,例如,当一个窗口从另一个窗口后面移动时。
发布于 2008-10-29 12:06:00
只要需要在列表框中绘制任何给定项,就会调用DrawItem()方法。如果没有响应,列表框中可能会出现一个空白区域,其中绘制的数据已被擦除,而您尚未刷新它。如果你真的不认为绘图是必要的,你可以这样做
void CMyListBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
if (!m_DrawingEnabled)
return;
}其中,m_DrawingEnabled是您维护以停止不必要的抽奖的成员,
https://stackoverflow.com/questions/246518
复制相似问题