現在メニュー項目が選択されている(マウスポインタがメニュー項目の上にあったり、キーボードで選択されて、反転して表示されている)時、その項目の説明を表示する方法を紹介します。
MenuStrip(またはContextMenuStrip)コントロールでは、メニュー項目のToolStripItem.ToolTipTextプロパティに文字列を設定すると、ツールヒント(ツールチップ)を表示することができます。この時、ToolStrip.ShowItemToolTipsプロパティはTrueにします。
ただしこの方法はマウスで選択している時だけツールヒントが表示され、キーボードで選択している時には表示されません。
'MenuStrip1にツールヒントが表示されるようにする MenuStrip1.ShowItemToolTips = True '「開く(&O)」項目に表示するツールヒントを設定する 開くOToolStripMenuItem.ToolTipText = "ファイルを開きます。"
//menuStrip1にツールヒントが表示されるようにする menuStrip1.ShowItemToolTips = true; //「開く(&O)」項目に表示するツールヒントを設定する 開くOToolStripMenuItem.ToolTipText = "ファイルを開きます。";
補足:MSDNの「方法 : ToolStrip コントロールにツールヒントを使用する」によると、ToolStrip.ShowItemToolTipsプロパティをTrueにしないとツールヒントが表示されないとありますが、トップレベル以外の項目はShowItemToolTipsがFalseでもツールヒントが表示されるようです。
補足:ToolStripItem.AutoToolTipプロパティをTrueにすると、ToolTipTextプロパティが空の時、代わりにTextプロパティの内容がツールヒントとして表示されるようになります。
イベントによってメニュー項目が選択状態にあるかを知るにはToolStripMenuItem.MouseEnterイベントが使えそうですが、これはマウスで選択した時のみ発生するため、キーボードでの選択には役に立ちません。いろいろ探しても、メニュー項目が選択されたことを知る適当なイベントは見つかりませんでした。
苦肉の策として、ToolStripMenuItem.Paintイベントで項目が選択されているか判断し、選択されていればその説明を表示するという方法を考えてみました。選択が解除されたときにステータスバーの表示を消す方法としては、MenuStrip.MenuDeactivateイベントを使用することにします。
以上の方針で作成したコードを以下に示します。フォームにMenuStrip(MenuStrip1)と、3つのToolStripMenuItem(Item11ToolStripMenuItem, Item12ToolStripMenuItem, Item13ToolStripMenuItem)、さらにLabelコントロール(Label1)が配置されているものとして、Label1にメニュー項目の説明を表示しています。
'MenuStrip1のMenuDeactivateイベントハンドラ Private Sub MenuStrip1_MenuDeactivate(sender As Object, e As EventArgs) _ Handles MenuStrip1.MenuDeactivate '説明文の表示を消す Label1.Text = "" End Sub 'ToolStripMenuItemのPaintイベントハンドラ Sub item1ToolStripMenuItem_Paint(sender As Object, e As PaintEventArgs) _ Handles Item11ToolStripMenuItem.Paint, _ Item12ToolStripMenuItem.Paint, _ Item13ToolStripMenuItem.Paint '対象となるToolStripMenuItemを取得する Dim item As ToolStripMenuItem = CType(sender, ToolStripMenuItem) '選択されていれば、説明文を表示する If item.Selected Then Label1.Text = item.Text + "が選択されています。" End If End Sub
//フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //イベントハンドラを追加する item11ToolStripMenuItem.Paint += new PaintEventHandler(item1ToolStripMenuItem_Paint); item12ToolStripMenuItem.Paint += new PaintEventHandler(item1ToolStripMenuItem_Paint); item13ToolStripMenuItem.Paint += new PaintEventHandler(item1ToolStripMenuItem_Paint); menuStrip1.MenuDeactivate += new EventHandler(menuStrip1_MenuDeactivate); } //MenuStrip1のMenuDeactivateイベントハンドラ private void menuStrip1_MenuDeactivate(object sender, EventArgs e) { //説明文の表示を消す Label1.Text = ""; } //ToolStripMenuItemのPaintイベントハンドラ private void item1ToolStripMenuItem_Paint(object sender, PaintEventArgs e) { //対象となるToolStripMenuItemを取得する ToolStripMenuItem item = (ToolStripMenuItem)sender; //選択されていれば、説明文を表示する if (item.Selected) { Label1.Text = item.Text + "が選択されています。"; } }
メニュー項目が選択されると、MenuItem.Selectイベントが発生しますので、これを利用することによってステータスバーに現在選択されているメニュー項目の説明を表示することができます。
次の例ではステータスバー(StatusBar1)にメニュー項目MenuItem11、MenuItem12、MenuItem13のうちどれが選択されているかを表示しています。ただしこの方法では、選択が解除されても表示は消えません。
'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Load AddHandler MenuItem11.Select, AddressOf MenuItem1_Select AddHandler MenuItem12.Select, AddressOf MenuItem1_Select AddHandler MenuItem13.Select, AddressOf MenuItem1_Select AddHandler Me.MenuComplete, AddressOf Form1_MenuComplete End Sub 'メニュー項目が選択された時に発生する Private Sub MenuItem1_Select(ByVal sender As Object, ByVal e As EventArgs) '表示する文字列 Dim s As String = CType(sender, MenuItem).Text 'ステータスバーに表示する StatusBar1.Text = s + "が選択されています。" End Sub 'フォームのメニューがフォーカスを失ったときに発生する Private Sub Form1_MenuComplete(ByVal sender As Object, ByVal e As EventArgs) 'ステータスバーの表示を消す StatusBar1.Text = "" End Sub
//フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { MenuItem11.Select += new EventHandler(MenuItem1_Select); MenuItem12.Select += new EventHandler(MenuItem1_Select); MenuItem13.Select += new EventHandler(MenuItem1_Select); this.MenuComplete += new EventHandler(Form1_MenuComplete); } //メニュー項目が選択された時に発生する private void MenuItem1_Select(object sender, EventArgs e) { //表示する文字列 string s = ((MenuItem)sender).Text; //ステータスバーに表示する StatusBar1.Text = s + "が選択されています。"; } //フォームのメニューがフォーカスを失ったときに発生する private void Form1_MenuComplete(object sender, EventArgs e) { //ステータスバーの表示を消す StatusBar1.Text = ""; }