Windows FormsのFillRectangleとDrawRectangleの描画範囲について

他のFill系関数Draw系関数も同じ動作をすると思いますが、
代表してRectangleを扱っています。

Graphics.DrawRectangleメソッドは矩形を引数で指定したPenを用いて描画する関数です。

Graphics.FillRectangleメソッドは「矩形の内側」を引数で指定したBrushを用いて塗りつぶす関数です。
「DrawRectangleメソッドで描画した内側」を塗りつぶす関数ではありません。

{x,y,width,height}={2,:2,:4,4}の矩形の内側ををFillRectangleで塗りつぶすと
次のように4*4の範囲が塗りつぶされます。

private void Form1_Paint(object sender, PaintEventArgs e)
{
     Brush brush = new SolidBrush(Color.Blue);
     Rectangle rect = new Rectangle(2, 2, 4, 4);
     e.Graphics.FillRectangle(brush, rect );
}

Fill1

DrawRectangleに2ピクセルのPenを渡し{x,y,width,height}={2,:2,:4,4}の矩形を描画すると
4*4の矩形の境界の周りに前後1ピクセルずつ、2ピクセルの太さの矩形が描画されまています。

private void Form1_Paint(object sender, PaintEventArgs e)
{
     Pen pen = new Pen( ForeColor, 2.0f );
     Rectangle rect = new Rectangle(2, 2, 4, 4); 
     e.Graphics.DrawRectangle(pen, rect );   
}

Fill2

またDrawRectangleに1ピクセル(奇数ピクセル)のPenを渡した場合、
本来次のように4*4の矩形の境界の前後に0.5ピクセルずつの1ピクセルの太さの矩形が描画されるべきなのですが
Draw1_1

0.5ピクセルを描画することは不可能なので四捨五入されて、
半ピクセルずつずれた状態で描画されます。

private void Form1_Paint(object sender, PaintEventArgs e)
{
     Pen pen = new Pen( ForeColor, 1.0f );
     Rectangle rect = new Rectangle(2, 2, 4, 4); 
     e.Graphics.DrawRectangle( pen , rect );
}

Draw1_2

DrawRectangleで描画された句形の内側を塗りつぶすには、
ペンのサイズを利用して、塗りつぶす句形の位置や大きさを調整する必要があります。

private void Form1_Paint(object sender, PaintEventArgs e)
{
     float penSize = 2.0f;
            
     Pen pen = new Pen(ForeColor, penSize);
     Brush brush = new SolidBrush(Color.Blue);

     Rectangle rect = new Rectangle(2, 2, 4, 4);
            
     RectangleF fillRect = new RectangleF(
          rect.X      + penSize / 2.0f,
          rect.Y      + penSize / 2.0f,
          rect.Width  - penSize,
          rect.Height - penSize
          );

     e.Graphics.DrawRectangle(pen, rect);
     e.Graphics.FillRectangle(brush, fillRect);
}

Fill2

広告

akatukisiden について

フリーランスプログラマ 使用言語はC++,C#とそのつなぎのC++/CLI 専門はクライアントアプリ開発
カテゴリー: C#, Windows Forms タグ: , , , , , , , , , パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中