WisdomSoft - for your serial experiences.

3.1 テキストを描画する

Graphics クラスの DrawString() メソッドを用いて、ウィンドウ上の任意の座標にテキストを描画します。

3.1.1 テキストの配置

コマンドプロンプトに文字列を出力する処理は Console.WriteLine() メソッドなどを使って文字を渡すだけで簡単に実現できましたが、ウィンドウに文字を表示する場合は文字だけでは情報が十分ではありません。GUI アプリケーション上にテキストを表示させるには、文字列の他にフォントや座標の情報が必要になります。

文字列をテキストとして描画するには Graphics クラスの DrawString() メソッドを使います。

Graphics クラス DrawString() メソッド
public void DrawString(string s, Font font, Brush brush, float x, float y)
public void DrawString(string s, Font font, Brush brush, PointF point)
public void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle)

s パラメータにはテキストとして描画する文字列を、font パラメータにはテキストのフォントを、brush パラメータにはテキストの内部を塗りつぶすブラシを設定します。

x パラメータと y パラメータにはテキストを開始する X 座標と Y 座標を指定します。左から右に流れる文字の場合、テキストの左上隅がこの開始座標となります。point パラメータは同様にテキストを開始する座標を指定します。

layoutRectangle パラメータを指定した場合は、テキストの描画範囲を表す矩形を設定します。この場合、テキストは矩形の中にのみ描画され、矩形の端まで文字が到達すると自動的に改行します。

PointF 型と RectangleF 型は、Point 構造体と Rectangle 構造体とほぼ同じで、int 型の変わりに float 型を使って座標やサイズを設定します。この名前から想像できるように SizeF 構造体も存在します。RectangleF 構造体はより単純な Rectangle 型の構造体を自動的に RectangleF 型の構造体に変換する型変換をオーバーライドしています。そのため、Rectangle 型の値を RectangleF 型に与えても問題はありません。

フォントは System.Drawing.Font クラスで表現されます。

System.Drawing.Font クラス
System.Object
    System.MarshalByRefObject
        System.Drawing.Font
[Serializable]
[ComVisible(true)]
public sealed class Font : MarshalByRefObject,
    ICloneable, ISerializable, IDisposable

文字列をテキストとして描画するには Font オブジェクトが必要になります。Font オブジェクトは Font クラスのコンストラクタから作成することができますが、通常は描画を行うコントロールに設定されているフォントを利用します。Control クラスにはコントロールのテキストで使うべきフォントを設定する Font プロパティが存在します。

Control クラス Font プロパティ
public virtual Font Font { get; set; }

Font クラスの詳細は後述しますので、まずは Control クラスの Font プロパティからフォントを取得して文字列を描画してみましょう。

コード1
using System.Drawing;
using System.Windows.Forms;

public class Test : Form
{
	protected override void OnPaint(PaintEventArgs e) 
	{
		base.OnPaint(e);
		SolidBrush brush = new SolidBrush(Color.Black);
		e.Graphics.DrawString(
			"Kitty on your lap", this.Font, brush, 10, 10); 

		RectangleF rect = new RectangleF(10, 30, 150, 50);
		e.Graphics.DrawString(
			"Blue blue Glass Moon, Under The Crimson Air.", this.Font, brush, rect);
	}
	static void Main() 
	{
		Application.Run(new Test());
	}
}
実行結果
コード1 実行結果

コード1では、座標を設定して文字列を描画する方法と、矩形を設定して文字列を描画する方法を比較しています。座標設定の場合は、指定した座標から左から右に向かって文字列が描画されます。これに対して、矩形を設定した場合は矩形の右端に到達すると自動的にテキストが改行します。テキストは矩形の外に描画されることはありません。

この他にオーバーロードされた DrawString() メソッドで System.Drawing.StringFormat クラスのオブジェクトを受けるものがあります。

Graphics クラス DrawString() メソッド
public void DrawString(
    string s, Font font, Brush brush, float
    x, float y, StringFormat format
)
public void DrawString(
    string s, Font font, Brush brush, PointF point, StringFormat format
)
public void DrawString(
    string s, Font font, Brush brush,
    RectangleF layoutRectangle, StringFormat format
)

StringFormat クラスは、描画するテキストのレイアウト情報を提供します。

System.Drawing.StringFormat クラス
System.Object
    System.MarshalByRefObject
        System.Drawing.StringFormat
public sealed class StringFormat :
    MarshalByRefObject, ICloneable, IDisposable

このクラスは、パラメータを受け取らない単純なコンストラクタからインスタンスを生成することができます。

テキストの配置情報は Alignment プロパティを設定します。このプロパティでは、テキストを左、右、中央のどこに合わせて配置するかを指定します。同様に行配置は LineAlignment プロパティで設定します。

StringFormat クラス Alignment プロパティ
public StringAlignment Alignment { get; set; }
StringFormat クラス LineAlignment プロパティ
public StringAlignment LineAlignment { get; set; }

これらのプロパティには System.Drawing.StringAlignment 列挙体のいずれかのメンバを指定します。

System.Drawing.StringAlignment 列挙体
[Serializable]
public enum StringAlignment

この列挙体には、テキストレイアウトを行う矩形に対して中央を表す Center、開始位置に最も近い Near、最も遠い Far を定義しています。描画対象の矩形に対して近いとは、左から右に流れるテキストのレイアウトを対象とした場合は左側、遠いとは右側を表します。上から下に向かう行の場合においては、近いとは上側、遠いとは下側を表します。

また、StringFormat オブジェクトの FormatFlags プロパティを設定することで、文字の方向などを設定することができます。

StringFormat クラス FormatFlags プロパティ
public StringFormatFlags FormatFlags { get; set; }

このプロパティには System.Drawing.StringFormatFlags 列挙体のメンバを設定します。

System.Drawing.StringFormatFlags 列挙体
[Flags]
[Serializable]
public enum StringFormatFlags

StringFormatFlags 列挙体は文字列の表示情報およびレイアウト情報を提供します。例えば、DirectionVertical メンバを指定すれば縦書きでテキストを描画するようになります。

コード2
using System.Drawing;
using System.Windows.Forms;

public class Test : Form
{
	protected override void OnPaint(PaintEventArgs e) 
	{
		base.OnPaint(e);
		SolidBrush brush = new SolidBrush(Color.Black);
		RectangleF rect = new RectangleF(0, 0, Width, Height);
		StringFormat format = new StringFormat();

		format.Alignment = StringAlignment.Center;
		format.LineAlignment = StringAlignment.Center;
		format.FormatFlags = StringFormatFlags.DirectionVertical;
		e.Graphics.DrawString(
			"家来の物は私の物。私の物も私の物よ。", this.Font, brush, rect, format);
	}
	static void Main() 
	{
		Application.Run(new Test());
	}
}
実行結果
コード2 実行結果

コード2は、ウィンドウのクライアント領域全体を描画対象として DrawString() メソッドを呼び出しています。このとき、StringFormat オブジェクトを作成して、矩形の中央にテキストを配置するように Alignment と LineAlignment プロパティを設定し、さらに縦書きを FormatlFlags プロパティに指定しています。実行結果のように、このプログラムはウィンドウの中央にテキストを縦書きで上から下に向かって描画します。