2011-07-26 4 views
0

私が作成しているカスタムコントロールは、クライアント空間に多くの「アイテム」を描画する必要があります。 Invalidate()を呼び出すと、すべてのアイテムが再描画される新しいペイントサイクルが開始されます。カスタムコントロールでのペイントと無効化のメカニズム

多くのアイテムがあり、コントロール内で多くのナビゲーションが発生すると、状況を最適化する必要があります。だから、1つか2つのアイテムしか描かれていない塗装サイクルを起動する必要があります。これらの項目への参照を格納するので、ペイント方法(OnPaint)が「素早く」わかるようになります。

OnPaintを実行すると、その間に他のInvalidate()呼び出しが行われたかどうかがわかりにくいです。その場合は、 "通常の"完全な塗料を行うべきです。

私はクリップの長方形を利用しています。もちろん、OnPaintのクリップ矩形がInvalidate()が呼び出されたサインのクライアント矩形全体になっているかどうかを確認できますが、これは100%安全ではありません。私は他の同様の解決策を考えましたが、彼らはハッキーに見えます。

この問題は、通常どのように解決されているのですか?

答えて

0

ここでの解決策は、BufferedGraphicsクラスでのダブルバッファリングアプローチを採用することです。この方法では、OnPaintで扱っているトリッキーなことはあまりありません。いつでも何でもペイントすることができます。

MSDN: Double Buffered Graphics( "手動で管理するバッファ・グラフィックス" の下)

ここで有用な例です: Custom Drawing Controls in C# – Manual Double Buffering

関連する問題