DOBON.NET DOBON.NETプログラミング掲示板過去ログ

「ステータスバーに現在選択されているメニュー項目の説明を表示する」について

環境/言語:[C#]
分類:[.NET]

ステータスバーに現在選択されているメニュー項目の説明を表示する
http://dobon.net/vb/dotnet/control/menuitemselect.html
についての意見です。
現状FormのLoadイベントハンドラでPaintイベントを追加していますが、
この方法だとメニューを変更するたびにいじらなくちゃいけませんし、
ToolStripMenuItemのさらに子要素の説明は表示できません。
そこで、ハンドラをMenuStripのLayoutCompletedイベントで再帰的に追加するようにしてみました。
また、説明はToolTipTextのほうから取得するようにしています。
よければサンプルのほうに書いてもらえるとうれしいです。
private void mmsMain_LayoutCompleted(object sender, EventArgs e)
{
    AddPaintHanderToTSMI(mmsMain.Items);
}

private void AddPaintHanderToTSMI(ToolStripItemCollection tsmic)
{
    foreach (ToolStripItem tsi in tsmic) {
        ToolStripMenuItem tsmi = tsi as ToolStripMenuItem;
        if (tsmi == null) {
            continue;
        }
        tsmi.Paint += new PaintEventHandler(tsmi_Paint);
        AddPaintHanderToTSMI(tsmi.DropDownItems);
    }
}
void tsmi_Paint(object sender, PaintEventArgs e)
{
    ToolStripMenuItem tsmi = sender as ToolStripMenuItem;
    if (tsmi == null || !tsmi.Selected) {
        return;
    }
    ToolStripStatusLabel1.Text = tsmi.ToolTipText + "が選択されています。");
}
ご提案ありがとうございます。

言い訳をさせていただくと、ステータスバーにメニュー項目の説明を表示する方法を紹介するのが目的ということで、より分かりやすい説明にするためにコードを簡単にしているということがあります。確かにある程度の規模のアプリケーションの場合は、一つ一つのメニュー項目についてちまちまとイベントハンドラに関連付けるのは面倒で、一度にできた方が実用的であり、その辺のフォローも必要だったかもしれませんね。

Hirotowさんのコードを拝見させていただくと、このままでは1つのToolStripMenuItemに同じイベントハンドラが何回も追加されてしまう恐れがあるので、その対応は必要になりそうですね。

DOBON.NET | プログラミング道 | プログラミング掲示板