Graphics.DrawStringメソッドには、書式を指定できるオーバーロードバージョンが存在します。
DrawStringメソッドの6つのオーバーロードバージョンのうち3つは、書式指定可能バージョンです。いずれも、最後の引数が書式指定用となります。
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 ) public void DrawString ( string s, Font font, Brush brush, float x, float y, StringFormat format )StringFormatクラスのStringFormatFlagsプロパティを使って、StringFormatFlags列挙体を設定します。StringFormatFlags列挙体のメンバには次のようなものがあります。
| メンバ名 | 意味 |
|---|---|
| DirectionRightToLeft | テキストを右から左へ表示する |
| DirectionVertical | テキストを縦方向に位置合わせする |
| DisplayFormatControl | 制御文字をグリフで表示する |
| FitBlackBox | 文字の一部がレイアウト四角形からはみ出すことを許可 |
| LineLimit | レイアウト四角形内で最後の1行の一部が隠れることがない |
| MeasureTrailingSpaces | 各行の行末に空白を含める |
| NoClip | グリフの突出部と書式指定用の四角形からはみ出すラップされていないテキストを表示できる |
| NoFontFallback | 要求されたフォントでサポートされていない文字のフォントを切り替えるフォールバックを無効にする |
| NoWrap | 行のテキストの折り返しを無効にする |
StringFormatクラスのAlignmentプロパティは、水平方向のテキスト配置を取得または設定します。これには、StringAlignment列挙体を利用します。
StringAlignment構造体のメンバには、次のようなものがあります。
| メンバ | |
|---|---|
| Center | レイアウト四角形の中央配置 |
| Far | 左から右のレイアウトでは、最も遠い位置の右側に配置 |
| Near | 左から右のレイアウトでは、最も近い位置の左側に配置 |
StringFormatクラスのLineAlignmentプロパティは、垂直方向のテキスト配置を取得または設定します。
Alignmentプロパティと同様StringAlignment列挙体を利用します。この時、Farが下端、Nearが上端の配置を表します。
では、簡単な例を見てみましょう。
この例では、フォームの大きさを変更したときにも、書式通りの表示になるよう工夫してあります。フォームの大きさが変更になると、Control.Resizeイベントが送信されます。このイベントに対して、Control.OnResizeメソッドの中で、Invalidateメソッドを実行します。すると、コントロールの表面全体が無効化され、Paintイベントが発生します。 Painイベントが発生したところで、テキストを表示すればフォームのサイズが変更されるたびに、指定の書式で描画が行われます。
// drawstring03.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class drawstring03
{
public static void Main()
{
MyForm mf = new MyForm();
Application.Run(mf);
}
}
Mainメソッドでは、MyFormクラス(Formクラスから派生)のインスタンスを生成して、その参照をApplication.Runメソッドに渡しています。いつも通りですね。
class MyForm : Form
{
private int w, h;
public MyForm()
{
Text = "猫でもわかるプログラミング";
BackColor = Color.White;
w = this.ClientSize.Width;
h = this.ClientSize.Height;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
string str = "猫でもわかるプログラミング";
RectangleF rf = new RectangleF(0, 0, w, h);
Font ft = new Font("MS ゴシック", 20);
SolidBrush brush = new SolidBrush(Color.Green);
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.FormatFlags = StringFormatFlags.DirectionVertical;
g.DrawRectangle(new Pen(Color.Red), 0F, 0F, (float)w-1F, (float)h-1F);
g.DrawString(str, ft, brush, rf, sf);
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
w = this.ClientSize.Width;
h = this.ClientSize.Height;
this.Invalidate();
}
}
自作クラスMyFormはFormクラスを継承しています。コンストラクタで、フォームのタイトル、背景色を設定しています。
また、クライアント領域の幅、高さを取得してフィールドw,hに代入しています。
クライアント領域のサイズを取得・設定するにはFormクラスのClientSizeプロパティを使います。
public Size ClientSize { get; set; }
ClientSizeの値は、Size構造体です。Size構造体のpublicなプロパティは次の3つです。
| プロパティ | 意味 |
|---|---|
| Height | 高さの取得・設定(int) |
| IsEmpty | 幅と高さが0かどうか(bool) |
| Width | 幅の取得・設定(int) |
OnPaintメソッドのところで、実際の描画処理を行います。
SolidBrush brush = new SolidBrush(Color.Green);とありますが、SolidBrushクラスはSystem.Drawing名前空間で定義されたクラスですで、単色のブラシをを定義します。Brushクラスから継承されています。
コンストラクタは、Color構造体で指定した新しいSolidBrushオブジェクトを生成します。
public SolidBrush ( Color color )DrawStringメソッドのbrushには、Brushクラスから派生したオブジェクトを指定できます。
StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.FormatFlags = StringFormatFlags.DirectionVertical;で、テキストの書式を中央、縦書きに指定しています。
OnResizeメソッドで、クライアント領域の幅、高さをw,hフィールドに設定しています。 フォームのサイズが変更されるたびにw,hを設定している点に注意してください。
そして、
this.Invalidate();で、このフォームの表面全体を無効化しています。これにより、Paintイベントが発生して、テキストの書き直し(再描画)が行われます。
では、実行結果を見てみましょう。
文字列が縦書き、中央寄せで表示されています。
フォームのサイズを変更しても、大丈夫です。
Update 22/Oct/2006 By Y.Kumei