5

WinFormアプリケーションで、OnPaint()イベントをサブスクライブするときに、描画する領域を定義するプロパティをPaintEventArgs提供します。ClipRectangle

フォームのサイズを垂直方向または水平方向に変更すると、描画する最小の長方形が得られます。

ここに画像の説明を入力してください

ただし、ウィンドウのサイズが両方向に変更されると、描画する必要のある領域がいくつかあり(1つは右側、もう1つは下部)、OnPaintイベントでそれらをマージします。その結果、と同じサイズの長方形にFormなります(したがって、すべてが再描画されます)。私が欲しいのは、別々の個々の領域です(写真の2つの長方形)

ここに画像の説明を入力してください

GDI+描画する必要のないもの(物は2つの長方形の外側にあるだけでなく)を自動的にクリップすることは知っていますが、呼び出しを最大ClipRectangleに抑えたいと思います(多くの呼び出しがあるため、イベントで描画するときにパフォーマンスの問題がすでに発生しています、これ時期尚早の最適化ではありません)GDI+OnPaintGDI+

4

1 に答える 1

3

Windowsでのペイントは、WM_PAINTメッセージハンドラーによって開始されます。ペイントする必要があるものに関する情報を取得するには、BeginPaint()を呼び出す必要があります。これはタイプPAINTSTRUCTの構造体を返し、次のようになります。

typedef struct tagPAINTSTRUCT {
  HDC  hdc;
  BOOL fErase;
  RECT rcPaint;              // <=== here
  BOOL fRestore;
  BOOL fIncUpdate;
  BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;

rcPaintメンバーは、Graphics.ClipRectangleから取得するメンバーです。Graphics.ClipプロパティとGraphics.ClipBoundsプロパティは関係ありません。これらは、Clipプロパティを割り当てて意図的にクリップした場合にのみ機能します。

明らかに、Windows自体はあなたが何を求めているのかを知ることを可能にしません。rcPaintは、単純な長方形であるRECTです。Windowsは、領域ではなく、ダーティな長方形のみを追跡します。InvalidateRect()によって追加された新しい長方形は、既存の長方形とマージされ、実際にクライアント領域全体に簡単に到達できます。

この問題に取り組む唯一の合理的な方法は、ResizeBeginイベントとResizeEndイベントに注意を払うことです。ResizeBeginを取得すると、ユーザーがウィンドウの端または隅をドラッグしていることがわかります。モーダルサイズ変更ループの動作を低下させる高価なビットをスキップして、ペイントを最適化するために使用できる知識。

于 2013-01-17T16:13:38.003 に答える