0

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

现在,当控件中有很多项并且发生很多导航时,需要优化;所以我需要触发一个只绘制一个或两个项目的绘制周期。我存储对这些项目的引用,以便绘制方法 (OnPaint) 知道它是“快速”的。

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

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

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

4

1 回答 1

0

这里的解决方案是使用 BufferedGraphics 类的双缓冲方法。这样,您的 OnPaint 中就不会发生太多棘手的事情,并且您可以随时随地进行绘画。

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

这是一个有用的示例: C# 中的自定义绘图控件 – 手动双缓冲

于 2011-08-19T15:50:53.823 回答