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つだ。
- MenuItemクラスを用いて、メニュー項目オブジェクトを作成する。
- メニュー項目の項目名(サブ・メニューがプルダウン表示されたときに表示される項目名)を各MenuItemオブジェクトのTextプロパティに設定する。
- メニュー項目がクリックされたときに呼び出されるイベント・ハンドラを、各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ができあがる。