SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

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

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

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

テキストの位置合わせ

 前記の例では、DrawStringメソッドに描画テキストの左上隅を表すX座標とY座標を渡していましたが(この方法はVisual Basic 6でも有効です)、X座標とY座標を渡す代わりに点(Point)を渡すこともできますし、テキストの描画領域となる矩形領域(Rectangle)を渡すこともできます。

 左上隅の座標を渡す方法には、テキストの位置合わせがしにくいという問題があります。例えば、テキストを右揃えにしたい場合、文字列の描画幅がどれだけになるか計算したうえで、右マージンから文字列の幅を差し引いた位置にX座標を設定する必要があります。テキストを中央揃えにしたい場合は、中央の座標から文字列の描画幅の半分を差し引く必要があります。垂直方向の位置合わせでも同様の計算が必要になります。

 こうした計算を多くの人たちが長年やってきたわけですが、DrawStringメソッドを使用すればテキストの位置合わせが簡単になります。DrawStringには、StringFormatオブジェクトをパラメータとして受け取るオーバーロードバージョンがいくつもあります。StringFormatオブジェクトのAlignmentプロパティとLineAlignmentプロパティによって、それぞれ文字列の水平方向の位置合わせと垂直方向の位置合わせが決定されます。AlignmentLineAlignmentの値をNearCenter、または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
図3 StringFormatを使用した位置合わせ。StringFormatオブジェクトによって、テキストを基点に対してどのように配置するかが決定される。
図3 StringFormatを使用した位置合わせ。StringFormatオブジェクトによって、テキストを基点に対してどのように配置するかが決定される。

 テキストを描画する方法としては、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で描画されたものです。

図4 矩形を使用した位置合わせ。StringFormatオブジェクトを使用すると、フォーマット矩形の領域内でテキストを位置合わせできる。
図4 矩形を使用した位置合わせ。StringFormatオブジェクトを使用すると、フォーマット矩形の領域内でテキストを位置合わせできる。

テキストのクリッピングと折り返し

 StringFormatオブジェクトのFormatFlagsプロパティは、DrawStringでテキストを描画する際の、フォーマット矩形内でのテキストの折り返しとクリッピングを制御します。表1に、クリッピングと折り返しの制御に使用できるFormatFlagsの値を示します。

表1 有効なFormatFlags値と、テキスト出力に与える影響
結果
FitBlackBox行が通常どおり折り返される。フォーマット矩形の下まで伸びる行はクリッピングされるので、行の一部しか描画されないこともある。
LineLimit大部分の行は通常どおり折り返される。テキストに含まれている行が多すぎて入りきらないと、最後の行が文字境界でクリッピングされるので、単語の一部が欠けることがある。
NoClip行が通常どおり折り返され、フォーマット矩形の下まで継続される。
NoWrap行が折り返されない。フォーマット矩形の端からはみ出す行はクリッピングされる。

 図5にFormatFlags値の効果を示します。StringFormatオブジェクトのFormatFlagsプロパティによって、テキストのクリッピングと折り返しをどのように行うかが決定されます。

図5 テキストのクリッピングと折り返し。
図5 テキストのクリッピングと折り返し。

 StringFormatオブジェクトのTrimmingプロパティも、DrawStringによるテキストのクリッピングに影響を及ぼします。このプロパティはStringTrimming列挙値を受け取ります。表2に有効なStringTrimming列挙値を示します。

表2 有効なStringTrimming値と、テキスト出力に与える影響
結果
Character収容できる最後の文字の後でテキストがトリミングされる。
EllipsisCharacter収容できる最後の文字の後でテキストがトリミングされ、末尾に省略記号が追加される。
EllipsisPath文字列が収まるように、文字列の中央部のテキストが省略記号に置き換えられる。これはファイルパスの先頭と末端を表示したいときに特に便利である。
EllipsisWord収容できる最後の単語の後でテキストがトリミングされ、末尾に省略記号が追加される。
Noneテキストがトリミングされない。
Word収容できる最後の単語の後でテキストがトリミングされる。

 例えば次のコードでは、収容できる最後の単語の後でテキストがクリッピングされ、末尾に省略記号が追加されます。

string_format.Trimming = StringTrimming.EllipsisWord

 サンプルプログラム「Ellipses」は、それぞれのStringTrimming値の使用例を示しています。図6は、StringFormat.TrimmingEllipsisCharacterに設定したときの出力例です。StringFormat.Trimmingプロパティを「EllipsisCharacter」に設定すると、トリミングされたテキストが描画され、末尾に省略記号が追加されます。

図6 文字列のトリミング
図6 文字列のトリミング

次のページ
テキストの変形・移動

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー