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

現在選択されているメニュー項目の説明を表示する

現在メニュー項目が選択されている(マウスポインタがメニュー項目の上にあったり、キーボードで選択されて、反転して表示されている)時、その項目の説明を表示する方法を紹介します。

.NET Framework 2.0以降で、MenuStrip(またはContextMenuStrip)コントロールを使用している場合

ツールヒントを表示する方法

MenuStrip(またはContextMenuStrip)コントロールでは、メニュー項目のToolStripItem.ToolTipTextプロパティに文字列を設定すると、ツールヒント(ツールチップ)を表示することができます。この時、ToolStrip.ShowItemToolTipsプロパティはTrueにします。

ただしこの方法はマウスで選択している時だけツールヒントが表示され、キーボードで選択している時には表示されません。

VB.NET
コードを隠すコードを選択
'MenuStrip1にツールヒントが表示されるようにする
MenuStrip1.ShowItemToolTips = True
'「開く(&O)」項目に表示するツールヒントを設定する
開くOToolStripMenuItem.ToolTipText = "ファイルを開きます。"
C#
コードを隠すコードを選択
//menuStrip1にツールヒントが表示されるようにする
menuStrip1.ShowItemToolTips = true;
//「開く(&O)」項目に表示するツールヒントを設定する
開くOToolStripMenuItem.ToolTipText = "ファイルを開きます。";

ToolStripItem.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にメニュー項目の説明を表示しています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//フォームの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 + "が選択されています。";
    }
}

MenuStripの場合

.NET Framework 1.1以前で、MainMenu(またはContextMenu)コントロールを使用している場合

メニュー項目が選択されると、MenuItem.Selectイベントが発生しますので、これを利用することによってステータスバーに現在選択されているメニュー項目の説明を表示することができます。

次の例ではステータスバー(StatusBar1)にメニュー項目MenuItem11、MenuItem12、MenuItem13のうちどれが選択されているかを表示しています。ただしこの方法では、選択が解除されても表示は消えません。

VB.NET
コードを隠すコードを選択
'フォームの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
C#
コードを隠すコードを選択
//フォームの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 = "";
}
  • 履歴:
  • 2007/1/16 MenuCompleteイベントで表示を消すように変更。MenuStripの場合を追加。
  • 2014/5/26 題名を変更。ツールヒントを表示する方法を追加など。

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。