在自定义控件中绘制和无效机制

时间:2011-07-26 21:52:26

标签: winforms custom-controls invalidation

我正在创建的自定义控件需要在其客户端空间中绘制许多“项”。对Invalidate()的调用将触发一个新的绘制周期,其中所有项目都将被重绘。

现在,当控件中有很多项目和大量导航时,需要对内容进行优化;所以我需要触发一个只绘制一个或两个项目的绘画循环。我存储对这些项的引用,以便paint方法(OnPaint)知道它是“快速”。

难点在于,当执行OnPaint时,很难知道在此期间是否进行了其他Invalidate()调用。在这种情况下,它应该做一个“正常”,完整的油漆。

我确实使用了剪辑矩形。当然,我可以检查OnPaint中的剪辑矩形是否已成为整个客户端矩形,这是一个调用Invalidate()的标志,但这不是100%安全的。我想到了其他类似的解决方案,但它们看起来很糟糕。

这个问题通常或最好的解决方法是什么?

1 个答案:

答案 0 :(得分:0)

这里的解决方案是采用BufferedGraphics类的双缓冲方法。通过这种方式,你的OnPaint中不会有太多棘手的东西,你可以随时画画。

MSDN: Double Buffered Graphics(在“手动管理缓冲图形”下)

这是一个有用的例子: Custom Drawing Controls in C# – Manual Double Buffering