ペンオブジェクトの概要
ペンオブジェクトの使い方は、基本的にブラシオブジェクトと同様です。ペンオブジェクトとブラシオブジェクトは関連性があり、ペンオブジェクトのコンストラクタには、ブラシオブジェクトを指定できます。
ペンオブジェクトとブラシオブジェクトの違いは、ペンオブジェクトはDraw系メソッド(DrawRectangle、DrawPolygonなど)で使用し、ブラシオブジェクトはFill系メソッド(FillRectangle、FillPolygonなど)で使用する点です。
また、ペン独自のプロパティがありますので、これからサンプルを交えて、ペンオブジェクト独自のプロパティについて解説します。ペンが描画する線はただの直線だけではなく、点線を描きたい場合もあります。GDI+では直線の種類を変えたい場合、ペンオブジェクトのDashStyleプロパティを設定します。次に、サンプルプロジェクトDashStyleSampleのコードを掲載します。
//重要な部分だけ抜粋
public partial class Form1 : Form
{
private void Form1_Paint( object sender, PaintEventArgs e )
{
//基本的な設定
Graphics grfx = e.Graphics;
Pen pen = new Pen( Color.Black );
pen.Width = 20;
float addY = pen.Width + 10; //描画間隔
float x = pen.Width;
float y = addY;
float endX = this.ClientSize.Width - pen.Width - 1;
//ダッシュスタイルが違う直線を描画
Array styles = Enum.GetValues( typeof( DashStyle ) );
for ( int i = 0; i < styles.Length - 1; i++ ) {
pen.DashStyle = ( DashStyle ) styles.GetValue( i );
grfx.DrawLine( pen, x, y, endX, y );
y += addY;
}
}
}

このサンプルは、全ダッシュスタイルの線を確認するものです。実行すれば、ダッシュスタイルの効果を確認できます。ペンオブジェクトのDashStyleプロパティを変更するだけでさまざまな直線が描かれている点に注目してください。
次に紹介するプロパティは、StartCapとEndCapです。このプロパティにLineCap列挙体を設定することにより、開始部分と終了部分が変化します。これは見ないと分かりませんので、サンプルプロジェクトLineCapSampleを用意しました。
//重要な部分だけ抜粋
public partial class Form1 : Form
{
private void Form1_Paint( object sender, PaintEventArgs e )
{
//基本的な設定
Graphics grfx = e.Graphics;
Pen pen = new Pen( Color.Black );
pen.DashStyle = DashStyle.DashDotDot;
pen.Width = 20;
float addY = pen.Width + 30; //描画間隔
float x = pen.Width;
float y = addY;
float endX = this.ClientSize.Width - pen.Width - 1;
//ラインキャップが違う直線を描画
Array styles = Enum.GetValues( typeof( LineCap ) );
for ( int i = 0; i < styles.Length - 1; i++ ) {
pen.StartCap = pen.EndCap = ( LineCap ) styles.GetValue( i );
grfx.DrawLine( pen, x, y, endX, y );
y += addY;
}
}
}

このサンプルでは、すべての System.Drawing.Drawing2D.LineCap列挙体の値を使用して直線を描画しています。なお、見やすくするためにStartCapとEndCapの値を同じとしました。実行するとその効果が確認できます。注目するべき箇所は、直線の開始部分と終了部分です。StartCapプロパティとEndCapプロパティの値を変えることにより、特色ある図形が描画できることが分かります。
最後に紹介するプロパティはLineJoinです。このプロパティにSystem.Drawing.Drawing2D.LineJoin列挙体の値を指定すると、連続する直線の結合部分の描画を指定できます。以下に、サンプルプロジェクトLineJoinSampleを用意しました。
//重要な部分だけ抜粋
public partial class Form1 : Form
{
private void Form1_Paint( object sender, PaintEventArgs e )
{
//ペンを設定
Pen pen = new Pen( Color.Black );
pen.Width = 20;
pen.LineJoin = ( LineJoin ) this.LineJoinList.SelectedItem;
//四角形を描画
Graphics grfx = e.Graphics;
grfx.DrawRectangle( pen,
this.DrawrRgion.Left + pen.Width,
this.DrawrRgion.Top + pen.Width,
this.DrawrRgion.Width - ( pen.Width * 2 ) - 1,
this.DrawrRgion.Height - ( pen.Width * 2 ) - 1 );
}
}

このサンプルでは、指定したLineJoinに応じて四角形を描画してします。このサンプルを実行すれば、どのように描画されるのか視覚的に理解できます。コンボボックスコントロールの値を変えて、角がどのように変化するのかを見てください。 これでペンについての解説は終わりです。次項から文字列や図形を描画する方法について解説します。
