C#プログラミングTips

メニュー作成の基礎

デジタルアドバンテージ
2001/05/30

 メニューはWindowsアプリケーションの基本的なユーザ・インターフェイスの1つだ。今回はC#におけるメニューの基本的な作り方を紹介する。

メニュー・サンプル・プログラム

 今回は次のような画面のサンプル・プログラムを作りながら、メニューの作成方法を解説していく。このプログラムのソース・コードは少々長いので、このページの最後に掲載した。

今回作成するサンプル・プログラムの実行画面
[BorderStyle]メニューからウィンドウのボーダー・スタイル(ウィンドウ枠の種類)を変更することができる。[終了]メニューをクリックするとプログラムは終了する。

 ただメニューを付けただけのサンプルではつまらないので、メニューからウィンドウのボーダー・スタイル(ウィンドウ枠の種類)を変更できるようにしてみた。[BorderStyle]メニューをクリックするとプルダウン表示されるサブ・メニューでは、フォームのボーダー・スタイルとして設定可能な7種類の項目を選択可能にした。このうちいくつかのメニュー項目を実行して、ウィンドウの枠を変更した例を次に示す(左から[Fixed3D][None][SizableToolWindow]を実行した場合のウィンドウ)。

[BorderStyle]メニューでボーダー・スタイルを変更したところ
[BorderStyle]−[Fixed3D]を実行。サイズ固定の立体的な枠のウィンドウになる。 [BorderStyle]−[None]を実行。枠もタイトル・バーもないウィンドウになる。 [BorderStyle]−[SizableToolWindow]を実行。ツール・ボックスなどに使用される、細い枠を持ち、最小化/最大化ボタンのないウィンドウになる(ウィンドウ・サイズは変更可能)。

メニューの構造

 プログラマから見たWindowsのメニューは、いくつかの部分(パーツ)から構成されている。まずはタイトル・バーのすぐ下に位置する「メニュー・バー」と呼ばれる部分だ。.NETのリファレンス・マニュアルでは、この部分は「メイン・メニュー」と呼ばれている。このメイン・メニュー上にある各項目は「メニュー項目(menu item)」と呼ばれる。今回のサンプル・プログラムでは、[BorderStyle][終了]の2つのメニュー項目がメイン・メニューに存在する。ここではこれらを「メイン・メニュー項目」と呼ぶことにする。メイン・メニュー項目をマウスでクリックすると、サブ・メニューがプルダウン表示される。ただしここでは、サブ・メニュー上の各項目は単に「メニュー項目」と呼ぶことにし、「メイン・メニュー項目」と区別することにする。今回のサンプル・プログラムでは、[Fixed3D][SizableToolWindow]の計7つのメニュー項目がある。これらの関係を図示すると次のようになる。

Windowsアプリケーションにおけるメニュー構造
さらに複雑なメニューも作成可能だが、基本的にメニューは次の3つのパーツに分類することができる。
  メニュー・バーとも呼ばれるメイン・メニュー
  メイン・メニュー項目
  メニュー項目

 アプリケーションによっては、サブ・メニュー上のメニュー項目がさらにサブ・メニューを持つこともあるが、それらもサブ・メニューに分類される。上に示したメニューの基本構造自体は変わらない。

 さて、図中ではメイン・メニューから順に番号を付けたが、プログラムでこれらを記述する場合には、逆の順で記述していった方が各部品のコードがまとまり、すっきりする。そこでまずは、サブ・メニュー上のメニュー項目から作っていくことにする。

サブ・メニュー上のメニュー項目の作成

 今回作成したサンプル・プログラム(全コードは本稿の最後に掲載)において、サブ・メニュー上のメニュー項目を作成している部分を抜き出すと次ようになる。

11: MenuItem menuBS1  = new MenuItem();
12: MenuItem menuBS2  = new MenuItem();
13: MenuItem menuBS3  = new MenuItem();
14: MenuItem menuBS4  = new MenuItem();
15: MenuItem menuBS5  = new MenuItem();
16: MenuItem menuBS6  = new MenuItem();
17: MenuItem menuBS7  = new MenuItem();
18:
19: menuBS1.Text = "Fixed3D";
20: menuBS2.Text = "FixedDialog";
21: menuBS3.Text = "FixedSingle";
22: menuBS4.Text = "FixedToolWindow";
23: menuBS5.Text = "None";
24: menuBS6.Text = "Sizable";
25: menuBS7.Text = "SizableToolWindow";
26:
27: menuBS1.Click += new System.EventHandler(menuBS1_Click);
28: menuBS2.Click += new System.EventHandler(menuBS2_Click);
29: menuBS3.Click += new System.EventHandler(menuBS3_Click);
30: menuBS4.Click += new System.EventHandler(menuBS4_Click);
31: menuBS5.Click += new System.EventHandler(menuBS5_Click);
32: menuBS6.Click += new System.EventHandler(menuBS6_Click);
33: menuBS7.Click += new System.EventHandler(menuBS7_Click);
サブ・メニュー項目の作成

 7つもメニュー項目があるので、コードが長くなっているが、メニュー項目を作成するために最低限必要な手順は次の3つだ。

  1. MenuItemクラスを用いて、メニュー項目オブジェクトを作成する。
  2. メニュー項目の項目名(サブ・メニューがプルダウン表示されたときに表示される項目名)を各MenuItemオブジェクトのTextプロパティに設定する。
  3. メニュー項目がクリックされたときに呼び出されるイベント・ハンドラを、各MenuItemオブジェクトのClickイベントに設定する。

 本格的なアプリケーションでは、これ以外にもショートカット・キーを付けたり(Shortcutプロパティを使用する)、必要ならばCheckedプロパティにより、メニュー項目にチェック・マークを付けることもできる。

 もちろん、イベント・ハンドラとして呼び出されるメソッドも定義する必要がある。例として[Fixed3D]メニュー項目がクリックされたときに呼び出されるイベント・ハンドラの定義部分を抜き出した。

63: protected void menuBS1_Click(object s, System.EventArgs e) {
64:   this.BorderStyle = FormBorderStyle.Fixed3D;
65: }
[BorderStyle]−[Fixed3D]がクリックされたときに呼び出されるイベント・ハンドラの定義

メイン・メニュー項目の作成

 続いてメイン・メニュー項目を作成する。同様にこの処理部分を抜き出すと次のようになる。

37: MenuItem menuBStyle = new MenuItem();
38: MenuItem menuExit   = new MenuItem();
39:
40: menuBStyle.Text = "BorderStyle";
41: menuExit.Text   = "終了";
42:
43: menuBStyle.MenuItems.Add(menuBS1);
44: menuBStyle.MenuItems.Add(menuBS2);
45: menuBStyle.MenuItems.Add(menuBS3);
46: menuBStyle.MenuItems.Add(menuBS4);
47: menuBStyle.MenuItems.Add(menuBS5);
48: menuBStyle.MenuItems.Add(menuBS6);
49: menuBStyle.MenuItems.Add(menuBS7);
50:
51: menuExit.Click += new System.EventHandler(menuExit_Click);
メイン・メニュー上の2つのメニュー項目の作成

 サブ・メニューのときと同じく、各メイン・メニュー項目に対応するMenuItemクラスのインスタンスを作成し、Textプロパティを設定する。[終了]メニューに関しては同様にイベント・ハンドラを設定するが、[BorderStyle]メニューにはイベント・ハンドラは必要ない。代わりに、先ほど作成した7つのメニュー項目をサブ・メニューとして追加していく。

 サブ・メニューを追加するには、MenuItemオブジェクトのMenuItemsプロパティを使用する。このプロパティはMenuItemのリストを保持することができるコレクションで、AddメソッドおよびRemoveメソッドにより、それぞれ項目の追加/削除を行うことができる。

メイン・メニューの作成

 ここまでで、7つのメニュー項目を持つ[BorderStyle]メイン・メニュー項目と、[終了]メイン・メニュー項目が作成された。次はこの2つのメイン・メニュー項目を持つメイン・メニューを作成する。

 メイン・メニューだけは、これまでに使用したMenuItemクラスではなく、MainMenuクラスよりインスタンスを作成する。ただしメイン・メニューへの項目の追加は、MenuItemと同様、コレクションであるMenuItemsプロパティのAddメソッドを使用する。

55: MainMenu mainMenu = new MainMenu();
56: mainMenu.MenuItems.Add(menuBStyle);
57: mainMenu.MenuItems.Add(menuExit);
メイン・メニューの作成

 これでメニューは完成したわけだが、このままではフォームとメニューが関連づけられていない。これには、フォームのMenuプロパティに対し、今作成したMainMenuクラスのインスタンスを設定する。

60: this.Menu = mainMenu;
フォームのMenuプロパティにメイン・メニューを設定する

 以上でプログラムは完成だ。今回示したメニューの作成は、最もシンプルな方法である。しかしMenuItemクラスのコンストラクタには、多くの引数をとる多機能なものも用意されているし、またMenuItemsプロパティに複数のメニュー項目を設定する方法もいくつかある。これらの詳細については、リファレンス・マニュアルを参照してほしい。

ソース・コードとコンパイル方法

 最後に、今回作成したサンプル・プログラムのソース・コードとコンパイル方法を掲載しておく。

 1: // menu.cs
 2:
 3: using System;
 4: using System.WinForms;
 5:
 6: public class MenuSample: Form {
 7:   public MenuSample() {
 8:
 9:     // サブ・メニューを開いたときに表示される項目の作成
10:
11:     MenuItem menuBS1  = new MenuItem();
12:     MenuItem menuBS2  = new MenuItem();
13:     MenuItem menuBS3  = new MenuItem();
14:     MenuItem menuBS4  = new MenuItem();
15:     MenuItem menuBS5  = new MenuItem();
16:     MenuItem menuBS6  = new MenuItem();
17:     MenuItem menuBS7  = new MenuItem();
18:
19:     menuBS1.Text = "Fixed3D";
20:     menuBS2.Text = "FixedDialog";
21:     menuBS3.Text = "FixedSingle";
22:     menuBS4.Text = "FixedToolWindow";
23:     menuBS5.Text = "None";
24:     menuBS6.Text = "Sizable";
25:     menuBS7.Text = "SizableToolWindow";
26:
27:     menuBS1.Click += new System.EventHandler(menuBS1_Click);
28:     menuBS2.Click += new System.EventHandler(menuBS2_Click);
29:     menuBS3.Click += new System.EventHandler(menuBS3_Click);
30:     menuBS4.Click += new System.EventHandler(menuBS4_Click);
31:     menuBS5.Click += new System.EventHandler(menuBS5_Click);
32:     menuBS6.Click += new System.EventHandler(menuBS6_Click);
33:     menuBS7.Click += new System.EventHandler(menuBS7_Click);
34:
35:     // メニュー・バー上の項目の作成
36:
37:     MenuItem menuBStyle = new MenuItem();
38:     MenuItem menuExit   = new MenuItem();
39:
40:     menuBStyle.Text = "BorderStyle";
41:     menuExit.Text   = "終了";
42:
43:     menuBStyle.MenuItems.Add(menuBS1);
44:     menuBStyle.MenuItems.Add(menuBS2);
45:     menuBStyle.MenuItems.Add(menuBS3);
46:     menuBStyle.MenuItems.Add(menuBS4);
47:     menuBStyle.MenuItems.Add(menuBS5);
48:     menuBStyle.MenuItems.Add(menuBS6);
49:     menuBStyle.MenuItems.Add(menuBS7);
50:
51:     menuExit.Click += new System.EventHandler(menuExit_Click);
52:
53:     // メイン・メニューの作成
54:
55:     MainMenu mainMenu = new MainMenu();
56:     mainMenu.MenuItems.Add(menuBStyle);
57:     mainMenu.MenuItems.Add(menuExit);
58:
59:     this.Text = "メニュー・サンプル";
60:     this.Menu = mainMenu;
61:   }
62:
63:   protected void menuBS1_Click(object s, System.EventArgs e) {
64:     this.BorderStyle = FormBorderStyle.Fixed3D;
65:   }
66:
67:   protected void menuBS2_Click(object s, System.EventArgs e) {
68:     this.BorderStyle = FormBorderStyle.FixedDialog;
69:   }
70:
71:   protected void menuBS3_Click(object s, System.EventArgs e) {
72:     this.BorderStyle = FormBorderStyle.FixedSingle;
73:   }
74:
75:   protected void menuBS4_Click(object s, System.EventArgs e) {
76:     this.BorderStyle = FormBorderStyle.FixedToolWindow;
77:   }
78:
79:   protected void menuBS5_Click(object s, System.EventArgs e) {
80:     this.BorderStyle = FormBorderStyle.None;
81:   }
82:
83:   protected void menuBS6_Click(object s, System.EventArgs e) {
84:     this.BorderStyle = FormBorderStyle.Sizable;
85:   }
86:
87:   protected void menuBS7_Click(object s, System.EventArgs e) {
88:     this.BorderStyle = FormBorderStyle.SizableToolWindow;
89:   }
90:
91:   protected void menuExit_Click(object s, System.EventArgs e) {
92:     this.Close();
93:   }
94:
95:   public static void Main() {
96:     Application.Run(new MenuSample());
97:   }
98: }
メニュー・サンプル・プログラムのソース・コード

 このサンプル・プログラムをコンパイルするには、コマンド・プロンプトから次のコマンドを実行する。

csc /r:Microsoft.Win32.Interop.DLL /r:System.DLL
  /r:System.WinForms.DLL  menu.cs
メニュー・サンプル・プログラムのコンパイル方法

 コンパイルが成功すれば、menu.exeができあがる。End of Article

「C#プログラミングTips」

 



Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間