テキストの位置合わせ
前記の例では、DrawStringメソッドに描画テキストの左上隅を表すX座標とY座標を渡していましたが(この方法はVisual Basic 6でも有効です)、X座標とY座標を渡す代わりに点(Point)を渡すこともできますし、テキストの描画領域となる矩形領域(Rectangle)を渡すこともできます。
左上隅の座標を渡す方法には、テキストの位置合わせがしにくいという問題があります。例えば、テキストを右揃えにしたい場合、文字列の描画幅がどれだけになるか計算したうえで、右マージンから文字列の幅を差し引いた位置にX座標を設定する必要があります。テキストを中央揃えにしたい場合は、中央の座標から文字列の描画幅の半分を差し引く必要があります。垂直方向の位置合わせでも同様の計算が必要になります。
こうした計算を多くの人たちが長年やってきたわけですが、DrawStringメソッドを使用すればテキストの位置合わせが簡単になります。DrawStringには、StringFormatオブジェクトをパラメータとして受け取るオーバーロードバージョンがいくつもあります。StringFormatオブジェクトのAlignmentプロパティとLineAlignmentプロパティによって、それぞれ文字列の水平方向の位置合わせと垂直方向の位置合わせが決定されます。AlignmentとLineAlignmentの値をNear、Center、またはFarに設定すれば、DrawStringでテキストを基点の左/上、中央、または右/下に配置することができます。
次のコードでは3行のテキストを水平方向に中央揃えしています。まず、これから描くテキストの基点の位置を分かりやすく示すために、ある点のX座標とY座標を定義し、FillEllipseを呼び出して丸印を付けています。次にUsingステートメントでStringFormatオブジェクトを作成し、AlignmentプロパティをCenterに設定して、テキストを水平方向に中央揃えします。そしてLineAlignmentプロパティをNearに設定し、基点の下にテキストを描画します。最後にDrawStringを呼び出して、前記の例で使用したものと同じようなパラメータを指定し、最後のパラメータとしてStringFormatオブジェクトを渡します。この実行結果を図3に示します。
Dim x As Integer = 150 Dim y As Integer = 20 e.Graphics.FillEllipse(Brushes.Red, x - 2, y - 2, 5, 5) Using string_format As New StringFormat() string_format.Alignment = StringAlignment.Center string_format.LineAlignment = StringAlignment.Near e.Graphics.DrawString( _ "Visual Basic" & vbCrLf & _ "Makes string formatting easy" & vbCrLf & _ "C# does also", _ Me.Font, Brushes.Blue, x, y, string_format) End Using

テキストを描画する方法としては、DrawStringにX座標とY座標または点を渡すよりも、むしろフォーマット矩形を渡すほうが直観的かもしれません。この方法ならば、StringFormatオブジェクトのAlignmentプロパティとLineAlignmentプロパティを使って、矩形内でのテキストの位置を指定できます。次のコードは、左上隅が(10, 10)にあり、幅175ピクセル、高さ70ピクセルの矩形の右下隅にテキストを描画する方法を示しています。
layout_rect = New Rectangle(10, 10, 175, 70) string_format.Alignment = StringAlignment.Far string_format.LineAlignment = StringAlignment.Far e.Graphics.DrawString("Far,Far", Me.Font, _ Brushes.Blue, layout_rect, string_format)
ダウンロードサンプル中のプログラム「StringAlignment」に完全なコードが含まれています。図4は、Alignment値とLineAlignment値の9通りの組み合わせによるサンプル文字列の描画結果を示しています。例えば、右上のテキストはAlignment = FarおよびLineAlignment = Nearで描画されたものです。
テキストのクリッピングと折り返し
StringFormatオブジェクトのFormatFlagsプロパティは、DrawStringでテキストを描画する際の、フォーマット矩形内でのテキストの折り返しとクリッピングを制御します。表1に、クリッピングと折り返しの制御に使用できるFormatFlagsの値を示します。
| 値 | 結果 |
| FitBlackBox | 行が通常どおり折り返される。フォーマット矩形の下まで伸びる行はクリッピングされるので、行の一部しか描画されないこともある。 |
| LineLimit | 大部分の行は通常どおり折り返される。テキストに含まれている行が多すぎて入りきらないと、最後の行が文字境界でクリッピングされるので、単語の一部が欠けることがある。 |
| NoClip | 行が通常どおり折り返され、フォーマット矩形の下まで継続される。 |
| NoWrap | 行が折り返されない。フォーマット矩形の端からはみ出す行はクリッピングされる。 |
図5にFormatFlags値の効果を示します。StringFormatオブジェクトのFormatFlagsプロパティによって、テキストのクリッピングと折り返しをどのように行うかが決定されます。

StringFormatオブジェクトのTrimmingプロパティも、DrawStringによるテキストのクリッピングに影響を及ぼします。このプロパティはStringTrimming列挙値を受け取ります。表2に有効なStringTrimming列挙値を示します。
| 値 | 結果 |
| Character | 収容できる最後の文字の後でテキストがトリミングされる。 |
| EllipsisCharacter | 収容できる最後の文字の後でテキストがトリミングされ、末尾に省略記号が追加される。 |
| EllipsisPath | 文字列が収まるように、文字列の中央部のテキストが省略記号に置き換えられる。これはファイルパスの先頭と末端を表示したいときに特に便利である。 |
| EllipsisWord | 収容できる最後の単語の後でテキストがトリミングされ、末尾に省略記号が追加される。 |
| None | テキストがトリミングされない。 |
| Word | 収容できる最後の単語の後でテキストがトリミングされる。 |
例えば次のコードでは、収容できる最後の単語の後でテキストがクリッピングされ、末尾に省略記号が追加されます。
string_format.Trimming = StringTrimming.EllipsisWord
サンプルプログラム「Ellipses」は、それぞれのStringTrimming値の使用例を示しています。図6は、StringFormat.TrimmingをEllipsisCharacterに設定したときの出力例です。StringFormat.Trimmingプロパティを「EllipsisCharacter」に設定すると、トリミングされたテキストが描画され、末尾に省略記号が追加されます。


