|
ニュース検索
ピックアップ
今週のIT求人情報
|
.NETでのテキスト処理技法をマスターするはじめに Visual Basic 6でテキストを描画するのは、プロセスも結果も非常に単純でした。まずフォームまたはPictureBoxの それに対し、.NETが提供するテキスト描画ツールはもっと強力です。ただし、能力が増大すれば複雑さも増すものです。.NETではテキストに対して驚くほど多様な操作を行えますが、それだけ学ぶべきことも多くあります。まずは単純なテキスト表示から始めて、フォントや位置合わせの変更、クリッピング、折り返し、シェーディング、変形・移動といった新たな技法を少しずつ覚えていけば、しだいに.NETのテキスト表示機能に精通するようになるでしょう。 本稿のサンプルコードには、これらの技法の具体例を示す一連の小さなアプリケーションが含まれています。このコードをそのまま使用することもできますし、これをテンプレートとして使用して、独自のアプリケーションを作成してもよいでしょう。なお、本稿の例ではVB.NETを使用していますが、ダウンロードできるサンプルコードにはVB.NETバージョンとC#バージョンが含まれています。 .NETにおけるテキストの基礎 .NETアプリケーションでテキストを描画するときは、必ず .NETのグラフィックスで素晴らしいことの1つは、 本稿の例では、フォームの .NETのテキスト描画ツールは複雑かもしれませんが、テキストを最も単純な形で描画するのは難しくありません。例えば、フォームの e.Graphics.DrawString("BasicText", Me.Font, Brushes.Blue, 10, 10) このコードを使うのは非常に簡単です。デザイン時にフォームのフォントを変更すれば、テキストを好みのフォントで描画できます。ただし、描画するテキストがすべて同じフォントになるという難点があります。 この問題に対処するため、次のような少しだけ複雑なバージョンで、このわずかなテキストのために独自のフォントを用意します。このコードは、24ポイントのボールドのComic Sans MSフォントを作成する、Usingステートメントで始まります。Usingステートメントの後のEnd Usingステートメントに達すると、VB.NETによってそのフォントの Using the_font As New Font("Comic Sans MS", 24, FontStyle.Bold) e.Graphics.DrawString("BasicText", the_font, _ Brushes.Blue, 10, 20) End Using 図1は、この2つの 図1 標準フォントとカスタムフォント ![]() VB.NETバージョンでは 図2 特殊文字の描画 ![]() テキストの位置合わせ 前記の例では、 左上隅の座標を渡す方法には、テキストの位置合わせがしにくいという問題があります。例えば、テキストを右揃えにしたい場合、文字列の描画幅がどれだけになるか計算したうえで、右マージンから文字列の幅を差し引いた位置にX座標を設定する必要があります。テキストを中央揃えにしたい場合は、中央の座標から文字列の描画幅の半分を差し引く必要があります。垂直方向の位置合わせでも同様の計算が必要になります。 こうした計算を多くの人たちが長年やってきたわけですが、 次のコードでは3行のテキストを水平方向に中央揃えしています。まず、これから描くテキストの基点の位置を分かりやすく示すために、ある点のX座標とY座標を定義し、 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 図3 StringFormatを使用した位置合わせ。StringFormatオブジェクトによって、テキストを基点に対してどのように配置するかが決定される。 ![]() テキストを描画する方法としては、 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は、 テキストのクリッピングと折り返し 表1 有効なFormatFlags値と、テキスト出力に与える影響
図5に 図5 テキストのクリッピングと折り返し。 ![]() 表2 有効なStringTrimming値と、テキスト出力に与える影響
例えば次のコードでは、収容できる最後の単語の後でテキストがクリッピングされ、末尾に省略記号が追加されます。 string_format.Trimming = StringTrimming.EllipsisWord サンプルプログラム「Ellipses」は、それぞれの 図6 文字列のトリミング ![]() テキストの変形・移動 例えば、次のコードでは垂直方向に引き伸ばされたテキストを描画しています。まずフォームの中心( 最後に水平方向の距離 このコードでは 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 図7 テキストの変形・移動。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」では、この テキストのシェーディング 例えば、次のコードではLinearGradientBrushでシェーディングされたテキストを描画しています。まずフォームの中心を見つけ、 ’ 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には、テキストを描画するための強力なツール群が用意されています。さまざまなフォントで、いろいろな位置にテキストを描画したり、クリッピングや折り返しや位置合わせを制御したり、伸縮や回転によりテキストを変形・移動したり、種々のブラシを使ってテキストをシェーディングしたり塗りつぶしたりすることができます。回転し、伸縮し、適切な位置に配置し、巧みにシェーディングしたテキストを描画するのは、若干手間のかかることかもしれませんが、少し練習すれば、テキスト処理技法を自在に使いこなせるようになります。 著者紹介Rod Stephens(Rod Stephens)
10冊以上の書籍と200点以上の雑誌記事の著者にしてコンサルタント。著作の大部分はVisual Basicに関するものである。これまで、修復ディスパッチ、燃料税トラッキング、プロフェッショナルなフットボールトレーニング、廃水処理、地図作成、チケット販売などの種々雑多なアプリケーションに従事してきた。彼のVB Helper Webサイトは、1か月に7百万以上のヒットを記録しており、Visual Basicプログラマ向けに3つのニューズレターと何千ものヒントや例を提供している。
|