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



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

现在,当有很多项目和很多导航发生在控制,事情需要优化;所以我需要触发一个绘画循环,其中只有一个或两个项目绘制。我存储对这些项的引用,以便油漆方法(OnPaint)知道它是一个"快速"。

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

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

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

这里的解决方案是对BufferedGraphics类采用双缓冲方法。这样你就不会有那么多棘手的东西在你的OnPaint中发生,你就可以随时随地作画了。

MSDN:双缓冲图形(在"手动管理缓冲图形"下)

下面是一个有用的例子:c#中的自定义绘图控件-手动双缓冲

最新更新