SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

.NETでのテキスト処理技法をマスターする

テキスト画像のクリッピング、折り返し、位置合わせ、伸縮、回転

ダウンロード ソースコード (233.8 KB)

テキストの変形・移動

 DrawStringは変形していない通常のフォントを使ってテキストを描画します。フォントを伸縮したり、回転したり、歪めたりすることはありません。ただし、DrawStringメソッドを提供しているGraphicsオブジェクトには、テキストを含めて、あらゆる描画物を回転したり、移動したり、伸縮したりするためのメソッドも用意されています。GraphicsオブジェクトのTranslateTransformScaleTransformRotateTransformの各メソッドは、描画物の移動、伸縮、回転を行います。

 例えば、次のコードでは垂直方向に引き伸ばされたテキストを描画しています。まずフォームの中心(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
図7 テキストの変形・移動。Graphicsオブジェクトではテキストを水平方向や垂直方向に伸縮したり、別の位置に移動したりできる
図7 テキストの変形・移動。Graphicsオブジェクトではテキストを水平方向や垂直方向に伸縮したり、別の位置に移動したりできる

 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を参照)。

図8 テキストの回転
図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は結果を示しています。テキストを囲んでいる矩形の縁の周りに余分なスペースがあることに注意してください。

図9 テキストの塗りつぶし。この図のように、LinearGradientBrushなどの任意のブラシでテキストを塗りつぶすことができる。
図9 テキストの塗りつぶし。この図のように、LinearGradientBrushなどの任意のブラシでテキストを塗りつぶすことができる。

おわりに

 Visual Studio .NETには、テキストを描画するための強力なツール群が用意されています。さまざまなフォントで、いろいろな位置にテキストを描画したり、クリッピングや折り返しや位置合わせを制御したり、伸縮や回転によりテキストを変形・移動したり、種々のブラシを使ってテキストをシェーディングしたり塗りつぶしたりすることができます。回転し、伸縮し、適切な位置に配置し、巧みにシェーディングしたテキストを描画するのは、若干手間のかかることかもしれませんが、少し練習すれば、テキスト処理技法を自在に使いこなせるようになります。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Rod Stephens(Rod Stephens)

10冊以上の書籍と200点以上の雑誌記事の著者にしてコンサルタント。著作の大部分はVisual Basicに関するものである。これまで、修復ディスパッチ、燃料税トラッキング、プロフェッショナルなフットボールトレーニング、廃水処理、地図作成、チケット販売などの種々雑多なアプリケーションに従事してきた。彼のWebサイト「VB Helper」は、1か月に7百万以上のヒットを記録しており、Visual Basicプログラマ向けに3つのニューズレターと何千ものヒントや例を提供している。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1121 2007/03/29 08:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー