テキストの変形・移動
DrawStringは変形していない通常のフォントを使ってテキストを描画します。フォントを伸縮したり、回転したり、歪めたりすることはありません。ただし、DrawStringメソッドを提供しているGraphicsオブジェクトには、テキストを含めて、あらゆる描画物を回転したり、移動したり、伸縮したりするためのメソッドも用意されています。GraphicsオブジェクトのTranslateTransform、ScaleTransform、RotateTransformの各メソッドは、描画物の移動、伸縮、回転を行います。
例えば、次のコードでは垂直方向に引き伸ばされたテキストを描画しています。まずフォームの中心(cx, cy)を見つけ、それからScaleTransformメソッドを使用し、水平方向の倍率を1とし(水平方向のサイズは変えない)、垂直方向の倍率を6として描画物を引き伸ばします。
最後に水平方向の距離cxと垂直方向の距離cyでの移動を追加します。こうすると、描画オブジェクトが原点を基準にして移動し、フォームの中央に配置されます。TranslateTransformの最後のパラメータがDrawing2D.MatrixOrder.Appendになっていることに注意してください。これにより、Graphicsオブジェクトが伸縮の後で移動を適用します。既定ではどういうわけか、これらのルーチンは先行する変形・移動があっても自らの処理を先に実行します。しかし、変形・移動は適切な順序で行うことが重要です。一般に、変形・移動が逆の順序で適用されると、結果は同じになりません。
このコードではGraphicsオブジェクトの変形・移動をセットアップした後に、原点に中央揃えされたテキストを描画しています。すると、定義した変形・移動によってテキストが引き伸ばされ、フォームの中心に移動します。実行結果を図7に示します。
Dim cx As Integer = Me.ClientSize.Width \ 2 Dim cy As Integer = Me.ClientSize.Height \ 2 e.Graphics.ScaleTransform(1, 6, Drawing2D.MatrixOrder.Append) e.Graphics.TranslateTransform(cx, cy, _ Drawing2D.MatrixOrder.Append) Using string_format As New StringFormat() string_format.Alignment = StringAlignment.Center string_format.LineAlignment = StringAlignment.Center e.Graphics.DrawString("StretchedText", Me.Font, _ Brushes.Blue, 0, 0, string_format) End Using

GraphicsオブジェクトのRotateTransformメソッドは、どんな描画物でも原点を基準にして回転させます。しかし、原点以外の点を基準にして回転させた方が便利なことが多いでしょう。RotateTransformで直接これを行うことはできませんが、他の点を基準にして回転を行うのは難しくありません。まず、その点を原点に移動し、回転を実行してから、その点をまた元の位置に移動すればよいのです。
次のコードに示すRotateAtメソッドは、このプロセスを簡単にするものです。任意の点を基準にして回転できるように、Graphicsオブジェクトを調整しています。
' Prepare the Graphics object to rotate ' at the indicated point. Private Sub RotateAt( _ ByVal gr As Graphics, _ ByVal cx As Integer, _ ByVal cy As Integer, _ ByVal angle As Single) gr.ResetTransform() gr.TranslateTransform(-cx, -cy, _ Drawing2D.MatrixOrder.Append) gr.RotateTransform(angle, _ Drawing2D.MatrixOrder.Append) gr.TranslateTransform(cx, cy, _ Drawing2D.MatrixOrder.Append) End Sub
サンプルプログラム「RotatedText」では、このRotateAtメソッドを使って、回転させた月名を格子の上に描画しています(図8を参照)。
テキストのシェーディング
Graphicsオブジェクトには主要なグラフィカルルーチン群が2つあります。図形を塗りつぶすものと描画するものです。例えば、DrawRectangleは矩形の輪郭を描画し、FillRectangleは矩形を塗りつぶします。これらの描画ルーチンは、直線の描画方法を制御するPenオブジェクトをパラメータとして受け取ります。同様に、塗りつぶしルーチンは、領域の塗りつぶし方法を制御するBrushesオブジェクトを受け取ります。
DrawStringメソッドは頭に「Draw」という語が付いていますが、実際にはテキストをブラシで塗りつぶしています。これまで見てきた例では塗りつぶしブラシ(SolidBrush)を使用していましたが、TextureBrush、HatchBrush、LinearGradientBrushといった、少し変わったブラシクラスを使用することもできます。
例えば、次のコードではLinearGradientBrushでシェーディングされたテキストを描画しています。まずフォームの中心を見つけ、StringFormatオブジェクトをセットアップして、テキストを基点に中央揃えします。それからGraphicsオブジェクトのMeasureString関数を使用し、フォームのフォントを使ってGraphicsオブジェクトで描画する際にテキストがどれだけの大きさになるかを調べます。このサイズは、テキストを収容する矩形の四隅の位置を知るために使います。また、垂直方向にグラデーションを付けて矩形を塗りつぶすブラシを作成し、このブラシでテキストを描画します。最後に矩形を描画します。
' Find the center of the form. Dim origin As New PointF( _ Me.ClientSize.Width \ 2, _ Me.ClientSize.Height \ 2) Const TXT As String = "ShadedText" Using string_format As New StringFormat() ' See how big the text will be using the form's font. string_format.Alignment = StringAlignment.Center string_format.LineAlignment = StringAlignment.Center Dim txt_size As SizeF = e.Graphics.MeasureString( _ TXT, Me.Font, origin, string_format) ' Make a brush that shades vertically. Dim rect As New Rectangle( _ origin.X - txt_size.Width \ 2, _ origin.Y - txt_size.Height \ 2, _ txt_size.Width, _ txt_size.Height) Using br As New LinearGradientBrush( _ rect, Color.Red, Color.Blue, _ LinearGradientMode.Vertical) e.Graphics.DrawString(TXT, Me.Font, br, _ origin, string_format) End Using ' br e.Graphics.DrawRectangle(Pens.Red, rect) End Using ' string_format
図9は結果を示しています。テキストを囲んでいる矩形の縁の周りに余分なスペースがあることに注意してください。
おわりに
Visual Studio .NETには、テキストを描画するための強力なツール群が用意されています。さまざまなフォントで、いろいろな位置にテキストを描画したり、クリッピングや折り返しや位置合わせを制御したり、伸縮や回転によりテキストを変形・移動したり、種々のブラシを使ってテキストをシェーディングしたり塗りつぶしたりすることができます。回転し、伸縮し、適切な位置に配置し、巧みにシェーディングしたテキストを描画するのは、若干手間のかかることかもしれませんが、少し練習すれば、テキスト処理技法を自在に使いこなせるようになります。


