0

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

これで、多くのアイテムがあり、コントロール内で多くのナビゲーションが発生する場合、物事を最適化する必要があります。したがって、1つまたは2つのアイテムのみが描画されるペイントサイクルをトリガーする必要があります。これらのアイテムへの参照を保存して、paintメソッド(OnPaint)が「クイック」であることを認識できるようにします。

難しいのは、OnPaintが実行されたときに、その間に他のInvalidate()呼び出しが行われたかどうかを知るのが難しいことです。その場合、それは「通常の」完全なペイントを行う必要があります。

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

この問題が通常、または最善の方法で解決される方法は何ですか?

4

1 に答える 1

0

ここでの解決策は、BufferedGraphicsクラスでダブルバッファリングアプローチを採用することです。このようにして、OnPaintでそれほどトリッキーなことが行われることがなくなり、いつでも、何でもペイントできるようになります。

MSDN:Double Buffered Graphics(「バッファリングされたグラフィックスの手動管理」の下)

便利な例を次に示します 。C#のカスタム描画コントロール–手動ダブルバッファリング

于 2011-08-19T15:50:53.823 に答える