第7章 フォーマットを指定してテキストを表示する


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イベントが発生して、テキストの書き直し(再描画)が行われます。

では、実行結果を見てみましょう。

文字列が縦書き、中央寄せで表示されています。



フォームのサイズを変更しても、大丈夫です。




[C# フォーム Index] [C# コンソール Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 22/Oct/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。