DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DOBON.NET

文字を描く

補足:画像の表示方法が分からない、描画した絵が消えて困るなどという方は、まず「画像ファイルを表示する」をご覧ください。また、ブラシについては、「塗りつぶした図形を描く」をご覧ください。

文字を描画するには、Graphics.DrawStringメソッドを用います。この時使用するフォントとブラシ(何色で表示するか)と表示位置を指定する必要があります。

簡単な例として、ピクチャボックス「PictureBox1」にフォント「MS UI Gothic」、大きさ20ポイントで青色の文字を描画するコードを示します。

[VB.NET]
'PictureBox1のGraphicsオブジェクトを取得
Dim g As Graphics = PictureBox1.CreateGraphics()

'フォントオブジェクトの作成
Dim fnt As New Font("MS UI Gothic", 20)
'文字列を位置(0,0)、青色で表示
g.DrawString("これはテストです。", fnt, Brushes.Blue, 0, 0)

'リソースを開放する
fnt.Dispose()
g.Dispose()
[C#]
//PictureBox1のGraphicsオブジェクトを取得
Graphics g = PictureBox1.CreateGraphics();

//フォントオブジェクトの作成
Font fnt = new Font("MS UI Gothic", 20);
//文字列を位置(0,0)、青色で表示
g.DrawString("これはテストです。", fnt, Brushes.Blue, 0, 0);

//リソースを開放する
fnt.Dispose();
g.Dispose();

折り返して描画する

次のようにRectangle構造体を指定すると、その内部に文字列が納まるように自動的に折り返されます。

[VB.NET]
'PictureBox1のGraphicsオブジェクトを取得
Dim g As Graphics = PictureBox1.CreateGraphics()

Dim drawString As String = "智に働けば角が立つ。情に棹させば流される。" _
 + vbCrLf + "意地を通せば窮屈だ。とかくに人の世は住みにくい。"
'Fontを作成
Dim fnt As New Font("MS ゴシック", 12)
'文字列を表示する範囲を指定する
Dim rect As New RectangleF(10, 10, 100, 200)
'rectの四角を描く
g.FillRectangle(Brushes.White, rect)
'文字を書く
g.DrawString(drawString, fnt, Brushes.Black, rect)

'リソースを開放する
fnt.Dispose()
g.Dispose()
[C#]
//PictureBox1のGraphicsオブジェクトを取得
Graphics g = PictureBox1.CreateGraphics();

string  drawString= @"智に働けば角が立つ。情に棹させば流される。
意地を通せば窮屈だ。とかくに人の世は住みにくい。";
//Fontを作成
Font fnt = new Font("MS ゴシック", 12);
//文字列を表示する範囲を指定する
RectangleF rect = new RectangleF(10, 10, 100, 200);
//rectの四角を描く
g.FillRectangle(Brushes.White, rect);
//文字を書く
g.DrawString(drawString, fnt, Brushes.Black, rect);

//リソースを開放する
fnt.Dispose();
g.Dispose();

縦書きで描画する

次のサンプルではStringFormatを指定することにより、文字を縦書きで書いています。フォントは縦書き用のものを使います。

[VB.NET]
'PictureBox1のGraphicsオブジェクトを取得
Dim g As Graphics = PictureBox1.CreateGraphics()

Dim drawString As String = "テストです。"
'Fontオブジェクトの作成(太字にする)
Dim fnt As New Font("@MS ゴシック", 16, FontStyle.Bold)
'StringFormatを作成
Dim sf As New StringFormat()
'縦書きにする
sf.FormatFlags = StringFormatFlags.DirectionVertical
'文字を表示
g.DrawString(drawString, fnt, Brushes.Black, 150F, 50F, sf)

'リソースを開放する
fnt.Dispose()
g.Dispose()
[C#]
//PictureBox1のGraphicsオブジェクトを取得
Graphics g = PictureBox1.CreateGraphics();

string  drawString= "テストです。";
//Fontオブジェクトの作成(太字にする)
Font fnt = new Font("@MS ゴシック", 16, FontStyle.Bold);
//StringFormatを作成
StringFormat sf = new StringFormat();
//縦書きにする
sf.FormatFlags = StringFormatFlags.DirectionVertical;
//文字を表示
g.DrawString(drawString, fnt, Brushes.Black,
    150.0F, 50.0F, sf);    

//リソースを開放する
fnt.Dispose();
g.Dispose();

グラデーションをかけて描画する

つぎはブラシを使って文字にグラデーションをかける例です。またStringFormatを指定することにより、文字を真ん中に表示するようにしています。グラデーションのブラシに関してはこちらを参考にしてください。

[VB.NET]
'Imports System.Drawing
'Imports System.Drawing.Drawing2D
'がソースファイルの一番上に書かれているものとする

'PictureBox1のGraphicsオブジェクトを取得
Dim g As Graphics = PictureBox1.CreateGraphics()

Dim drawString As String = "テストです。"
'Fontを作成
Dim fnt As New Font("MS ゴシック", 24)
'線形グラデーション(横に黄色から赤)を作成
Dim b As New LinearGradientBrush(PictureBox1.ClientRectangle, _
 Color.Yellow, Color.Red, LinearGradientMode.Horizontal)
'StringFormatを作成
Dim sf As New StringFormat
'文字を真ん中に表示
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
'文字を書く
g.DrawString(drawString, fnt, b, _
    RectangleF.op_Implicit(PictureBox1.ClientRectangle), sf)


'リソースを開放する
fnt.Dispose()
b.Dispose()
g.Dispose()
//using System.Drawing;
//using System.Drawing.Drawing2D;
//がソースファイルの一番上に書かれているものとする

//PictureBox1のGraphicsオブジェクトを取得
Graphics g = PictureBox1.CreateGraphics();

string  drawString= "テストです。";
//Fontを作成
Font fnt = new Font("MS ゴシック", 24);
//線形グラデーション(横に黄色から赤)を作成
LinearGradientBrush b = new LinearGradientBrush(
                            PictureBox1.ClientRectangle,
                            Color.Yellow,
                            Color.Red,
                            LinearGradientMode.Horizontal);
//StringFormatを作成
StringFormat sf = new StringFormat();
//文字を真ん中に表示
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
//文字を書く
g.DrawString(drawString, fnt, b,
    PictureBox1.ClientRectangle, sf);

//リソースを開放する
fnt.Dispose();
b.Dispose();
g.Dispose();

TextRenderer.DrawTextメソッドを使用する方法

.NET Framework 2.0からはTextRendererクラスが追加され、このDrawTextメソッドにより文字列を描画することもできるようになりました。

Graphics.DrawStringメソッドとの違いは、Graphics.DrawStringメソッドがGDI+を使ってテキスト描画しているのに対して、TextRenderer.DrawTextメソッドはGDIを使用している点です。

こちらで紹介しているように、UseCompatibleTextRenderingプロパティがTrueのコントロールはGraphics.DrawStringではなく、TextRenderer.DrawTextで描画されます。なぜこのようなやり方が必要になったかという点に関してMSDN「Application.SetCompatibleTextRenderingDefault メソッド」では、「GDI+ にパフォーマンスとローカライズに関する問題があるから」とされています。

TextRenderer.DrawTextメソッドは、印刷で使用することはできません。また、色の指定にColor型を使用しているため、ブラシを使って描画することはできません。

さらにこちらで指摘しているように、描画する文字列の中にある&はアンダーラインとして描画されます。&のまま描画する方法は、こちらで紹介しています。

以下にTextRenderer.DrawTextメソッドを使って文字列を描画する例を示します。一番初めに紹介したコードをTextRenderer.DrawTextメソッドを使って書き換えました。

[VB.NET]
'PictureBox1のGraphicsオブジェクトを取得
Dim g As Graphics = PictureBox1.CreateGraphics()

'フォントオブジェクトの作成
Dim fnt As New Font("MS UI Gothic", 20)
'文字列を位置(0,0)、青色で表示
System.Windows.Forms.TextRenderer.DrawText( _
    g, "これはテストです。", fnt, New Point(0, 0), Color.Blue)

'リソースを開放する
fnt.Dispose()
g.Dispose()
[C#]
//PictureBox1のGraphicsオブジェクトを取得
Graphics g = PictureBox1.CreateGraphics();

//フォントオブジェクトの作成
Font fnt = new Font("MS UI Gothic", 20);
//文字列を位置(0,0)、青色で表示
System.Windows.Forms.TextRenderer.DrawText(
    g, "これはテストです。", fnt, new Point(0, 0), Color.Blue);

//リソースを開放する
fnt.Dispose();
g.Dispose();

Graphics.DrawStringと比べてどのように表示されるか比較してみました。下図の上がGraphics.DrawStringで、下がTextRenderer.DrawTextです。

文字列を"wwwwwwwwww"にして描画すると、次のようになります。やはり上がGraphics.DrawStringで、下がTextRenderer.DrawTextです。

  • 履歴:
  • 2006/11/24 .NET Framework 1.1からVB.NETでDrawStringメソッドの4番目のパラメータがRectangle型ではエラーとなる不具合を修正。
  • 2007/2/14 TextRenderer.DrawTextメソッドを使用する方法を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。