10

System.Windows.Forms.Control の継承で OnPaint または OnPaintBackground メソッドをオーバーライドする場合、1 つの引数は常に System.Windows.Forms.PaintEventArgs オブジェクトです。部分的なオブジェクト構造:

  • PaintEventArgs
    • ClipRectangle (System.Drawing.Rectangle)
    • グラフィックス(System.Drawing.Graphics)
      • クリップ(System.Drawing.Region)
      • ClipBounds (System.Drawing.RectangleF)
      • VisibleClipBounds (System.Drawing.RectangleF)

Graphics.Clipは、後続のペイント操作に影響を与える適用可能なピクセルの 1 ビット マップのように見えます。

MSDN: 「この Graphics の描画領域を制限する Region を取得または設定します。」

Graphics.ClipBoundsは、Clip 領域を完全に含む最小の四角形のように見える読み取り専用の四角形です。

MSDN: 「この Graphics のクリッピング領域の境界となる RectangleF 構造体を取得します。」

Graphics.VisibleClipBoundsは、より「インテリジェントな」クリップのようですが、それがどのように動作するかはわかりません。

MSDN: 「この Graphics の表示クリッピング領域の境界四角形を取得します。」

ClipRectangleは、すべての場合に Graphics.ClipBounds プロパティを複製しているように見えます。

MSDN:「描画する四角形を取得します。」

誰かが主な質問に答えて、さまざまな境界オブジェクトが何のためにあるのかを明らかにすることができますか?

編集: Dan-oの回答に従ってMSDNの説明を追加しました。

4

1 に答える 1

15

PaintEventArgs.ClipRectangle は、実際に Paint イベントで描画する必要がある四角形です。通常、コントロールのクライアント領域のサイズと同じです。一部だけ他のウィンドウと重なった場合は小さくなります。または、その Invalidate(Rectangle) メソッドを呼び出すとき。これを使用して、その長方形の外側にある高価なオブジェクトの描画をスキップできます。これは非常にまれなことですが、Windows 自体は、描画したものをクリッピングするという非常に優れた機能を既に備えています。

Graphics.Clip は、自分で描画したものをクリップするために描画コードで割り当てることができる領域です。円で切り取った画像を描くなど、さまざまな効果が得られます。または、領域に変換された GraphicsPath を使用する非常に複雑なクリッピング効果。

Graphics.ClipBounds は、Graphics.Clip を囲む四角形です。ポイントが Graphics.Clip の外側にあるかどうかに関係なく、一次推定値を取得するための計算が高速になります。Clip プロパティ (X=-4194304,Y=-4194304,Width=8388608,Height=8388608) を割り当てていない場合、無意味な「無限」のクリップ境界が得られます。

Graphics.VisibleClipBounds は Graphics.ClipBounds と同じですが、コントロール ウィンドウによってもクリップされます。ポイントがクリップ領域にあり、ユーザーに表示されるかどうかをテストするのに非常に便利です。Clip プロパティを割り当てない場合は、ウィンドウのサイズを取得するだけです。

したがって、PaintEventArgs.ClipRectangle を設定するのは Windows です。残りは、Graphics.Clip プロパティを割り当てることによって設定されます。

于 2012-08-21T20:45:03.217 に答える