注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。また、文字列を描画させる方法は、「文字を書く」をご覧ください。
Label、Button、MenuItemコントロールなどのTextで"&"という文字を使うと、その次の文字にはアンダーラインが付いて表示されます。これと同じように文字列をGraphics.DrawStringメソッドで描画するには、指定するStringFormatオブジェクトのHotkeyPrefixプロパティをHotkeyPrefix.Showとします。ちなみに、HotkeyPrefixプロパティをHotkeyPrefix.Hideとすると、"&"もアンダーラインも表示されくなります。
次に簡単な例を示します。この例ではフォームにPictureBoxコントロール"PictureBox1"があるものとし、その結果は上の画像のようになります。
'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
//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;
.NET Framework 2.0から追加されたTextRenderer.DrawTextメソッドで文字列を描画する場合は、何もする必要はありません。デフォルトで&がアンダーラインで描画されます。
逆に&をアンダーラインとして描画したくない場合は、TextFormatFlagsにNoPrefixを指定します。その他にアンダーラインを隠すHidePrefixや、アンダーラインだけを表示するPrefixOnlyも用意されています。
以下にこれらを指定したときの違いを確かめるためのコードとその結果を示します。
'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
//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でも使用できました。