多くのWindowsアプリケーションには、タイトルバーの下にメニュー(メニューバー)が付いています。このようにフォームにメインメニューを付けるには、MenuStripコントロールを使用します。ここでは、MenuStripコントロールを使ってメインメニューを作成する方法の基本的な事柄を説明します。
なおMenuStripコントロールは、.NET Framework 2.0以降でのみ使用できます。.NET Framework 1.1以前では、代わりにMainMenuコントロールを使用します。MainMenuコントロールについてはここでは説明しませんが、基本的な使い方はMenuStripコントロールとほぼ同じです。
Visual Studioのフォームデザイナを使えば、直感的な操作で簡単にメニューを作成することができます。あまりに簡単ですので、説明の必要もないかもしれませんが、一応その手順を紹介します。
まず、Visual Studioのフォームデザイナで、メインメニューを設置したいフォームを開きます。
次に「ツールボックス」から「MenuStrip」を探し、フォームへドラッグ&ドロップします。
すると、フォームのタイトルバーの下にメニューが付きます(まだ空っぽですが)。また、フォームデザイナの下部には、「menuStrip1」(VB.NETでは、「MenuStrip1」)と書かれたMenuStripコントロールのアイコンが表示されます。
メニューの左端に「ここへ入力」と書かれた枠があります(ない場合は、タイトルバーの下のメニュー部分をクリックするか、フォームデザイナの下にある「menuStrip1」をクリックしてください)。「ここへ入力」をクリックすると、文字を入力できるようになります。ここでは、「ファイル(&F)」と入力してみましょう。
次に、フォームの何もないところをクリックしてみてください。これでメニューに「ファイル(F)」という項目(コマンド)が作成されたと思います。
「ファイル(F)」の「F」にアンダーライン(アンダースコア)が付いていることに注目してください。このように、「&」の後の文字にはアンダーラインが付きます。アンダーラインが付いた文字は「アクセスキー」を示しており、その文字のキーとAltキーを一緒に押すと(または、Altキーを押してからその文字のキーを押すと)その項目を選択することができます。「ファイル(F)」の場合は、フォームがアクティブな時に「F + Alt」キーを押すと、「ファイル(F)」をクリックした時と同じことができます。
アクセスキーは、メニュー項目が「ファイル」ならば「F」、編集ならば「E」、表示ならば「V」、ヘルプならば「H」というように、お約束があります。色々なアプリケーションのメニューを参考にして、真似をしてみてください。
アクセスキーは、すべての項目に付けるようにしてください。
なお「&」と表示するには、「&&」と「&」を2つ続けて入力します。
フォームデザイナで「ファイル(F)」をクリックしてみてください。「ファイル(F)」の右側と下に「ここへ入力」が表示されたと思います。ここで右側の「ここへ入力」に何か入力すると、右側に新しい項目を追加できます。下の「ここへ入力」に入力すると、「ファイル(F)」をクリックしたときに表示される子項目(ドロップダウンメニュー)を作成できます。子項目にはさらに子項目(サブメニュー、階層メニュー)を作成することもできます。
メニュー項目に表示するテキストについて、もう一つお約束を紹介します。そのメニュー項目を選択した時にダイアログボックスが表示されるのであれば、テキストの最後に「...」(ピリオド3つ)を付けます。
例えばファイルを保存する項目の場合、「上書き保存」ならば通常はダイアログボックスが開きませんので、「上書き保存(S)」のように「...」は付けません。しかし「名前を付けて保存」の場合は必ずダイアログボックスが開きますので、「名前を付けて保存(A)...」のように「...」を付けます。
区切り線(上の画像で「名前を付けて保存」と「終了」の間にある横棒、セパレータ)を作るには、「-」(ハイフンマイナス)とだけ入力します。
一般的なアプリケーションでは、「Ctrl + S」キーを押すとファイルを保存、「Ctrl + O」キーを押すとファイルを開くといったショートカットキーが設定されています。このようなショートカットキーを設定するには、設定したいメニュー項目を選択してから、プロパティウィンドウで「ShortcutKeysプロパティ」の値を変更します。
以下の画像は、「開く」メニューに「Ctrl + O」というショートカットキーを設定しているところです。
ショートカットキーを設定すると、テキストの右端に自動で「Ctrl+O」と表示されます(ShowShortcutKeysプロパティがTrueの時)。
アクセスキーと同様にショートカットキーにも、ファイルを開くには「Ctrl+O」、ファイルを上書き保存するには「Ctrl+S」、クリップボードにコピーするには「Ctrl+C」、切り取るには「Ctrl+X」、貼り付けるには「Ctrl+V」などのようなお約束があります。
以上のようにして、必要なだけメニュー項目を追加してください。
作成したメニュー項目は、ドラッグ&ドロップで位置を変更することができます。また、Deleteキーで削除することができます。テキストを変更するには、項目を選択してからマウスの左ボタンを長押しするか、F2キーを押します。
これで見た目には立派に出来上がりましたが、中身がありません。メニュー項目がクリックされた時に何かしたい場合は、Clickイベントハンドラを作成します。Clickイベントハンドラを作成する最も(?)簡単な方法は、フォームデザイナでメニュー項目をダブルクリックすることです。ダブルクリックすると自動でClickイベントハンドラが作成されて、エディタ画面が開きます。
例えば「開く(O)」メニュー項目をダブルクリックした時は、次のようなClickイベントハンドラが作成されます。
Private Sub 開くOToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles 開くOToolStripMenuItem.Click End Sub
private void 開くOToolStripMenuItem_Click(object sender, EventArgs e) { }
このメソッドの中に、「開く(O)」が選択された時に実行するコードを記述します。
これで、一通りの説明は終了です。
上記のようにVisual Studioのフォームデザイナを使わずに、自分でコードを書くことによって、動的にメインメニューを作成することもできます。ただこの方法は初心者向きではなく、かと言ってそれ以上の方であれば説明するまでもないと思います(「コントロールを実行時に作成する」が参考になります)。ですのでここでは、上記フォームデザイナを使った方法で紹介したこととほぼ同じことを行うコードのサンプルのみを紹介します。
'Imports System.Windows.Forms Private menuStrip1 As MenuStrip 'フォームのLoadイベントハンドラ Private Sub Form1_Load(sender As Object, e As EventArgs) _ Handles MyBase.Load 'MenuStripを作成する Me.menuStrip1 = New MenuStrip() 'レイアウトロジックを停止する Me.SuspendLayout() Me.menuStrip1.SuspendLayout() '「ファイル(&F)」メニュー項目を作成する Dim fileMenuItem As New ToolStripMenuItem() fileMenuItem.Text = "ファイル(&F)" 'MenuStripに追加する Me.menuStrip1.Items.Add(fileMenuItem) '「開く(&O)...」メニュー項目を作成する Dim openMenuItem As New ToolStripMenuItem() openMenuItem.Text = "開く(&O)..." 'ショートカットキー「Ctrl+O」を設定する openMenuItem.ShortcutKeys = Keys.Control Or Keys.O openMenuItem.ShowShortcutKeys = True 'Clickイベントハンドラを追加する AddHandler openMenuItem.Click, AddressOf openMenuItem_Click '「ファイル(&F)」のドロップダウンメニューに追加する fileMenuItem.DropDownItems.Add(openMenuItem) '「上書き保存(&S)」メニュー項目を作成する Dim saveMenuItem As New ToolStripMenuItem() saveMenuItem.Text = "上書き保存(&S)" saveMenuItem.ShortcutKeys = Keys.Control Or Keys.S saveMenuItem.ShowShortcutKeys = True fileMenuItem.DropDownItems.Add(saveMenuItem) '「名前を付けて保存(&A)...」メニュー項目を作成する Dim saveAsMenuItem As New ToolStripMenuItem() saveAsMenuItem.Text = "名前を付けて保存(&A)..." fileMenuItem.DropDownItems.Add(saveAsMenuItem) 'セパレータを追加する fileMenuItem.DropDownItems.Add(New ToolStripSeparator()) '「終了(&X)」メニュー項目を作成する Dim exitMenuItem As New ToolStripMenuItem() exitMenuItem.Text = "終了(&X)" fileMenuItem.DropDownItems.Add(exitMenuItem) 'フォームにMenuStripを追加する Me.Controls.Add(Me.menuStrip1) 'フォームのメインメニューとする Me.MainMenuStrip = Me.menuStrip1 'レイアウトロジックを再開する Me.menuStrip1.ResumeLayout(False) Me.menuStrip1.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() End Sub '「開く(&O)...」メニュー項目のClickイベントハンドラ Private Sub openMenuItem_Click(sender As Object, e As EventArgs) MessageBox.Show("「開く」が選択されました。") End Sub
//using System.Windows.Forms; MenuStrip menuStrip1; //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //MenuStripを作成する this.menuStrip1 = new MenuStrip(); //レイアウトロジックを停止する this.SuspendLayout(); this.menuStrip1.SuspendLayout(); //「ファイル(&F)」メニュー項目を作成する ToolStripMenuItem fileMenuItem = new ToolStripMenuItem(); fileMenuItem.Text = "ファイル(&F)"; //MenuStripに追加する this.menuStrip1.Items.Add(fileMenuItem); //「開く(&O)...」メニュー項目を作成する ToolStripMenuItem openMenuItem = new ToolStripMenuItem(); openMenuItem.Text = "開く(&O)..."; //ショートカットキー「Ctrl+O」を設定する openMenuItem.ShortcutKeys = Keys.Control | Keys.O; openMenuItem.ShowShortcutKeys = true; //Clickイベントハンドラを追加する openMenuItem.Click += openMenuItem_Click; //「ファイル(&F)」のドロップダウンメニューに追加する fileMenuItem.DropDownItems.Add(openMenuItem); //「上書き保存(&S)」メニュー項目を作成する ToolStripMenuItem saveMenuItem = new ToolStripMenuItem(); saveMenuItem.Text = "上書き保存(&S)"; saveMenuItem.ShortcutKeys = Keys.Control | Keys.S; saveMenuItem.ShowShortcutKeys = true; fileMenuItem.DropDownItems.Add(saveMenuItem); //「名前を付けて保存(&A)...」メニュー項目を作成する ToolStripMenuItem saveAsMenuItem = new ToolStripMenuItem(); saveAsMenuItem.Text = "名前を付けて保存(&A)..."; fileMenuItem.DropDownItems.Add(saveAsMenuItem); //セパレータを追加する fileMenuItem.DropDownItems.Add(new ToolStripSeparator()); //「終了(&X)」メニュー項目を作成する ToolStripMenuItem exitMenuItem = new ToolStripMenuItem(); exitMenuItem.Text = "終了(&X)"; fileMenuItem.DropDownItems.Add(exitMenuItem); //フォームにMenuStripを追加する this.Controls.Add(this.menuStrip1); //フォームのメインメニューとする this.MainMenuStrip = this.menuStrip1; //レイアウトロジックを再開する this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } //「開く(&O)...」メニュー項目のClickイベントハンドラ private void openMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("「開く」が選択されました。"); }