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

文字を描く

注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。また、ブラシについては、「塗りつぶした図形を描く」をご覧ください。

Graphics.DrawStringメソッドを使用する方法

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

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

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Windows.Forms

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

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

'リソースを解放する
fnt.Dispose()
g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Windows.Forms;

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

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

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

//PictureBox1に表示する
PictureBox1.Image = canvas;

折り返して描画する

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

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Windows.Forms

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

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()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Windows.Forms;

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

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();

//PictureBox1に表示する
PictureBox1.Image = canvas;

文字列を折り返して描画する

縦書きで描画する

次のサンプルではStringFormat.FormatFlagsプロパティにStringFormatFlags.DirectionVerticalを指定したStringFormatオブジェクトを使用して、文字を縦書きで書いています。フォントは縦書き用のものを使います。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Windows.Forms

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

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)

'リソースを解放する
sf.Dispose()
fnt.Dispose()
g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Windows.Forms;

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

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);    

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

//PictureBox1に表示する
PictureBox1.Image = canvas;

文字列を縦書きで描画する

左から右に表示する

上記の方法で縦書きにすると、そのままでは左から右に文章が表示されます。右から左に表示されるようにするには、StringFormatのFormatFlagsにDirectionRightToLeftを追加します。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Windows.Forms

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

Dim drawString As String = "智に働けば角が立つ。情に棹させば流される。" _
    + vbCrLf + "意地を通せば窮屈だ。とかくに人の世は住みにくい。"
Dim fnt As New Font("@MS ゴシック", 12)
Dim rect As New RectangleF(10, 10, 100, 200)
g.FillRectangle(Brushes.White, rect)

'StringFormatを作成
Dim sf As New StringFormat()
'縦書きにして、右から左に表示する
sf.FormatFlags = StringFormatFlags.DirectionVertical Or _
    StringFormatFlags.DirectionRightToLeft

g.DrawString(drawString, fnt, Brushes.Black, rect, sf)

sf.Dispose()
fnt.Dispose()
g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Windows.Forms;

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

string drawString = @"智に働けば角が立つ。情に棹させば流される。
意地を通せば窮屈だ。とかくに人の世は住みにくい。";
Font fnt = new Font("@MS ゴシック", 12);
RectangleF rect = new RectangleF(10, 10, 100, 200);
g.FillRectangle(Brushes.White, rect);

//StringFormatを作成
StringFormat sf = new StringFormat();
//縦書きにして、右から左に表示する
sf.FormatFlags = StringFormatFlags.DirectionVertical |
    StringFormatFlags.DirectionRightToLeft;

g.DrawString(drawString, fnt, Brushes.Black, rect, sf);

sf.Dispose();
fnt.Dispose();
g.Dispose();

//PictureBox1に表示する
PictureBox1.Image = canvas;

文字列を縦書きにして、右から左に描画する

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

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

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Drawing.Drawing2D
'がソースファイルの一番上に書かれているものとする

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

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()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Drawing.Drawing2D;
//がソースファイルの一番上に書かれているものとする

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

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();

//PictureBox1に表示する
PictureBox1.Image = canvas;

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

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

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

Graphics.DrawStringメソッドとの違いは、Graphics.DrawStringメソッドがGDI+を使ってテキスト描画しているのに対して、TextRenderer.DrawTextメソッドはGDIを使用している点です。.NET Framework 2.0以降では、通常コントロールのテキストはTextRenderer.DrawTextメソッドでレンダリングされます。詳しくは、「.NET Framework 2.0以降でも1.1と同じGDI+でコントロールの文字列を描画する」をご覧ください。

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

さらに、描画する文字列の中にある&はアンダーラインとして描画されます。&のまま描画する方法は、「TextRenderer.DrawTextメソッドを使用して描画する場合」で紹介しています。

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

VB.NET
コードを隠すコードを選択
'Imports System.Drawing
'Imports System.Windows.Forms

Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'フォントオブジェクトの作成
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()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;
//using System.Windows.Forms;

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

//フォントオブジェクトの作成
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();

//PictureBox1に表示する
PictureBox1.Image = canvas;

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

Graphics.DrawStringとTextRenderer.DrawTextの比較1

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

Graphics.DrawStringとTextRenderer.DrawTextの比較2

  • 履歴:
  • 2006/11/24 .NET Framework 1.1からVB.NETでDrawStringメソッドの4番目のパラメータがRectangle型ではエラーとなる不具合を修正。
  • 2007/2/14 TextRenderer.DrawTextメソッドを使用する方法を追加。
  • 2012/3/11 「左から右に表示する」を追加。「UseCompatibleTextRenderingプロパティがTrueのコントロールは...」を「Falseのコントロールは...」に修正。
  • 2012/8/3 表示する方法を、PictureBox.Imageプロパティを使った方法に変更。

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

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