この章では、メニュー項目が選択されたとき、その説明をステータスバーに表示するプログラムを作ります。
メニュー項目が選択されたことを知るには、MenuItemクラスのSelectイベントを処理します。MenuItem.Selectイベントは、次のように定義されています。
public event EventHandler Selectこのイベントは、親メニューに関しては発生しません。
さて、選択されたメニュー項目が実行されたり、あるいはキャンセルされたときは、ステータスバーに表示された内容を消さなくてはなりません。これは、どうするかというと、MenuItemクラスのイベントを調べても解決しません。
Form.MenuCompleteイベントを利用します。これは、フォームのメニューがフォーカスを失ったときに発生します。
Formクラスから派生したクラスでは、Form.OnMenuCompleteイベントハンドラが利用できます。
では、簡単なサンプルを見てみましょう。
// status06.cs using System; using System.Drawing; using System.Windows.Forms; class status06 : Form { StatusBarPanel sb1, sb2; public static void Main() { Application.Run(new status06()); } public status06() { Text = "猫でもわかるC#プログラミング"; BackColor = SystemColors.Window; StatusBar sb = new StatusBar(); sb.Parent = this; sb.ShowPanels = true; sb1 = new StatusBarPanel(); sb2 = new StatusBarPanel(); sb1.AutoSize = StatusBarPanelAutoSize.Contents; sb2.AutoSize = StatusBarPanelAutoSize.Spring; sb.Panels.Add(sb1); sb.Panels.Add(sb2); MenuItem miFile = new MenuItem("ファイル(&F)"); MenuItem miEdit = new MenuItem("編集(&E)"); MainMenu mm = new MainMenu(); Menu = mm; mm.MenuItems.Add(miFile); mm.MenuItems.Add(miEdit); MenuItem miNew = new MenuItem("新規作成(&N)"); miNew.Click += new EventHandler(miNew_Click); miNew.Select += new EventHandler(miNew_Select); miFile.MenuItems.Add(miNew); MenuItem miExit = new MenuItem("終了(&X)"); miExit.Click += new EventHandler(miExit_Click); miExit.Select += new EventHandler(miExit_Select); miFile.MenuItems.Add(miExit); MenuItem miCopy = new MenuItem("コピー(&C)"); miCopy.Click += new EventHandler(miCopy_Click); miCopy.Select += new EventHandler(miCopy_Select); miEdit.MenuItems.Add(miCopy); } void miNew_Select(object sender, EventArgs e) { sb1.Text = "新規に作成します"; } void miNew_Click(object sender, EventArgs e) { MessageBox.Show("「新規作成」が選択されました", "猫でもわかるC#プログラミング", MessageBoxButtons.OK, MessageBoxIcon.Information); } void miExit_Select(object sender, EventArgs e) { sb1.Text = "このプログラムを終了します"; } void miExit_Click(object sender, EventArgs e) { Close(); } void miCopy_Select(object sender, EventArgs e) { sb1.Text = "コピーします"; } void miCopy_Click(object sender, EventArgs e) { MessageBox.Show("「コピー」が選択されました", "猫でもわかるC#プログラミング", MessageBoxButtons.OK, MessageBoxIcon.Information); } protected override void OnMenuComplete(EventArgs e) { base.OnMenuComplete(e); sb1.Text = ""; } }status06クラスはFormクラスから継承されています。
コンストラクタでは、StatusBarオブジェクトとStatusBarPanelオブジェクトを生成しています。
また、メニューを作るときに、それぞれのメニュー項目に対して、異なる名前のSelectイベントハンドラをインストールしている点に注意してください。
status06クラスは、Formクラスから継承しているので、OnMenuCompleteメソッドを利用しています。
実行結果は次のようになります。
選択されたメニュー項目の説明が、ステータスバーに表示されています。
Update 07/Mar/2007 By Y.Kumei