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

&をアンダーラインとして文字列を描画する

注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。また、文字列を描画させる方法は、「文字を書く」をご覧ください。

Label、Button、MenuItemコントロールなどのTextで"&"という文字を使うと、その次の文字にはアンダーラインが付いて表示されます。これと同じように文字列をGraphics.DrawStringメソッドで描画するには、指定するStringFormatオブジェクトのHotkeyPrefixプロパティをHotkeyPrefix.Showとします。ちなみに、HotkeyPrefixプロパティをHotkeyPrefix.Hideとすると、"&"もアンダーラインも表示されくなります。

次に簡単な例を示します。この例ではフォームにPictureBoxコントロール"PictureBox1"があるものとし、その結果は上の画像のようになります。

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

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

'StringFormatオブジェクトの作成
Dim sf As New StringFormat
'ホットキープリフィックスを表示する(&をアンダーバーにする)
sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show

'フォントオブジェクトの作成
Dim fnt As New Font("MS UI Gothic", 20)

'文字列を表示
g.DrawString("&DOBON.&&NE&T&", fnt, Brushes.Black, New PointF(0, 0), sf)

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

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

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

//StringFormatオブジェクトの作成
StringFormat sf = new StringFormat();
//ホットキープリフィックスを表示する(&をアンダーバーにする)
sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;

//フォントオブジェクトの作成
Font fnt = new Font("MS UI Gothic", 20);

//文字列を表示
g.DrawString("&DOBON.&&NE&T&", fnt, Brushes.Black, new PointF(0, 0), sf);

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

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

TextRenderer.DrawTextメソッドを使用して描画する場合

.NET Framework 2.0から追加されたTextRenderer.DrawTextメソッドで文字列を描画する場合は、何もする必要はありません。デフォルトで&がアンダーラインで描画されます。

逆に&をアンダーラインとして描画したくない場合は、TextFormatFlagsにNoPrefixを指定します。その他にアンダーラインを隠すHidePrefixや、アンダーラインだけを表示するPrefixOnlyも用意されています。

以下にこれらを指定したときの違いを確かめるためのコードとその結果を示します。

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

'描画先とする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)、青色で表示
System.Windows.Forms.TextRenderer.DrawText(g, _
    "&DOBON.&&NE&T&", fnt, New Point(0, 0), Color.Black)

'&先頭文字の処理を無効にする
System.Windows.Forms.TextRenderer.DrawText(g, _
    "&DOBON.&&NE&T&", fnt, New Point(0, 25), Color.Black, _
    TextFormatFlags.NoPrefix)

'&先頭文字を無視する
System.Windows.Forms.TextRenderer.DrawText(g, _
    "&DOBON.&&NE&T&", fnt, New Point(0, 50), Color.Black, _
    TextFormatFlags.HidePrefix)

'&先頭文字の次の文字の位置に下線だけを描画する
System.Windows.Forms.TextRenderer.DrawText(g, _
    "&DOBON.&&NE&T&", fnt, New Point(0, 75), Color.Black, _
    TextFormatFlags.PrefixOnly)

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

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

//描画先とする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, "&DOBON.&&NE&T&", fnt, new Point(0, 0), Color.Black);

//&先頭文字の処理を無効にする
System.Windows.Forms.TextRenderer.DrawText(
    g, "&DOBON.&&NE&T&", fnt, new Point(0, 25), Color.Black,
    TextFormatFlags.NoPrefix);

//&先頭文字を無視する
System.Windows.Forms.TextRenderer.DrawText(
    g, "&DOBON.&&NE&T&", fnt, new Point(0, 50), Color.Black,
    TextFormatFlags.HidePrefix);

//&先頭文字の次の文字の位置に下線だけを描画する
System.Windows.Forms.TextRenderer.DrawText(
    g, "&DOBON.&&NE&T&", fnt, new Point(0, 75), Color.Black,
    TextFormatFlags.PrefixOnly);

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

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

結果は、次のようになります。

Graphics.DrawStringと比較すると、最後の&だけがアンダーラインになっており、それ以外は隠されることが分かります。

なおMSDNの「TextFormatFlags 列挙体」では、HidePrefixとPrefixOnlyはWindows 2000またはWindows XPだけに適用されると書かれていますが、私が試した限りでは、Windows 7でも使用できました。

  • 履歴:
  • 2007/2/14 「TextRenderer.DrawTextメソッドを使用して描画する場合」を追加。
  • 2012/8/4 表示する方法を、PictureBox.Imageプロパティを使った方法に変更。

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

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