DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

フォームにメインメニューを付ける

多くのWindowsアプリケーションには、タイトルバーの下にメニュー(メニューバー)が付いています。このようにフォームにメインメニューを付けるには、MenuStripコントロールを使用します。ここでは、MenuStripコントロールを使ってメインメニューを作成する方法の基本的な事柄を説明します。

なおMenuStripコントロールは、.NET Framework 2.0以降でのみ使用できます。.NET Framework 1.1以前では、代わりにMainMenuコントロールを使用します。MainMenuコントロールについてはここでは説明しませんが、基本的な使い方はMenuStripコントロールとほぼ同じです。

Visual Studioのフォームデザイナを使用する方法

Visual Studioのフォームデザイナを使えば、直感的な操作で簡単にメニューを作成することができます。あまりに簡単ですので、説明の必要もないかもしれませんが、一応その手順を紹介します。

1. フォームにMenuStripコントロールを配置する

まず、Visual Studioのフォームデザイナで、メインメニューを設置したいフォームを開きます。

次に「ツールボックス」から「MenuStrip」を探し、フォームへドラッグ&ドロップします。

ツールボックス

すると、フォームのタイトルバーの下にメニューが付きます(まだ空っぽですが)。また、フォームデザイナの下部には、「menuStrip1」(VB.NETでは、「MenuStrip1」)と書かれたMenuStripコントロールのアイコンが表示されます。

MenuStripが設置されたフォーム

2. メニュー項目を作成する

メニューの左端に「ここへ入力」と書かれた枠があります(ない場合は、タイトルバーの下のメニュー部分をクリックするか、フォームデザイナの下にある「menuStrip1」をクリックしてください)。「ここへ入力」をクリックすると、文字を入力できるようになります。ここでは、「ファイル(&F)」と入力してみましょう。

「ファイル(&F)」を作成中

次に、フォームの何もないところをクリックしてみてください。これでメニューに「ファイル(F)」という項目(コマンド)が作成されたと思います。

「ファイル(&F)」ができる

3. アクセスキーを設定する

「ファイル(F)」の「F」にアンダーライン(アンダースコア)が付いていることに注目してください。このように、「&」の後の文字にはアンダーラインが付きます。アンダーラインが付いた文字は「アクセスキー」を示しており、その文字のキーとAltキーを一緒に押すと(または、Altキーを押してからその文字のキーを押すと)その項目を選択することができます。「ファイル(F)」の場合は、フォームがアクティブな時に「F + Alt」キーを押すと、「ファイル(F)」をクリックした時と同じことができます。

アクセスキーは、メニュー項目が「ファイル」ならば「F」、編集ならば「E」、表示ならば「V」、ヘルプならば「H」というように、お約束があります。色々なアプリケーションのメニューを参考にして、真似をしてみてください。

アクセスキーは、すべての項目に付けるようにしてください。

なお「&」と表示するには、「&&」と「&」を2つ続けて入力します。

4. 新しい項目を追加する

フォームデザイナで「ファイル(F)」をクリックしてみてください。「ファイル(F)」の右側と下に「ここへ入力」が表示されたと思います。ここで右側の「ここへ入力」に何か入力すると、右側に新しい項目を追加できます。下の「ここへ入力」に入力すると、「ファイル(F)」をクリックしたときに表示される子項目(ドロップダウンメニュー)を作成できます。子項目にはさらに子項目(サブメニュー、階層メニュー)を作成することもできます。

右と下に表示される「ここへ入力」

5. テキストの末尾に「...」を付ける

メニュー項目に表示するテキストについて、もう一つお約束を紹介します。そのメニュー項目を選択した時にダイアログボックスが表示されるのであれば、テキストの最後に「...」(ピリオド3つ)を付けます。

例えばファイルを保存する項目の場合、「上書き保存」ならば通常はダイアログボックスが開きませんので、「上書き保存(S)」のように「...」は付けません。しかし「名前を付けて保存」の場合は必ずダイアログボックスが開きますので、「名前を付けて保存(A)...」のように「...」を付けます。

作成中のメニュー

6. セパレータを追加する

区切り線(上の画像で「名前を付けて保存」と「終了」の間にある横棒、セパレータ)を作るには、「-」(ハイフンマイナス)とだけ入力します。

7. ショートカットキーを設定する

一般的なアプリケーションでは、「Ctrl + S」キーを押すとファイルを保存、「Ctrl + O」キーを押すとファイルを開くといったショートカットキーが設定されています。このようなショートカットキーを設定するには、設定したいメニュー項目を選択してから、プロパティウィンドウで「ShortcutKeysプロパティ」の値を変更します。

以下の画像は、「開く」メニューに「Ctrl + O」というショートカットキーを設定しているところです。

ショートカットキーの設定

ショートカットキーを設定すると、テキストの右端に自動で「Ctrl+O」と表示されます(ShowShortcutKeysプロパティがTrueの時)。

ショートカットキーを設定した後

アクセスキーと同様にショートカットキーにも、ファイルを開くには「Ctrl+O」、ファイルを上書き保存するには「Ctrl+S」、クリップボードにコピーするには「Ctrl+C」、切り取るには「Ctrl+X」、貼り付けるには「Ctrl+V」などのようなお約束があります。

8. 項目の位置を変更する

以上のようにして、必要なだけメニュー項目を追加してください。

作成したメニュー項目は、ドラッグ&ドロップで位置を変更することができます。また、Deleteキーで削除することができます。テキストを変更するには、項目を選択してからマウスの左ボタンを長押しするか、F2キーを押します。

9. 項目がクリックされた時に実行するコードを記述する

これで見た目には立派に出来上がりましたが、中身がありません。メニュー項目がクリックされた時に何かしたい場合は、Clickイベントハンドラを作成します。Clickイベントハンドラを作成する最も(?)簡単な方法は、フォームデザイナでメニュー項目をダブルクリックすることです。ダブルクリックすると自動でClickイベントハンドラが作成されて、エディタ画面が開きます。

例えば「開く(O)」メニュー項目をダブルクリックした時は、次のようなClickイベントハンドラが作成されます。

VB.NET
コードを隠すコードを選択
Private Sub 開くOToolStripMenuItem_Click(sender As Object, e As EventArgs) _
    Handles 開くOToolStripMenuItem.Click

End Sub
C#
コードを隠すコードを選択
private void 開くOToolStripMenuItem_Click(object sender, EventArgs e)
{

}

このメソッドの中に、「開く(O)」が選択された時に実行するコードを記述します。

これで、一通りの説明は終了です。

自分でコードを書く方法

上記のようにVisual Studioのフォームデザイナを使わずに、自分でコードを書くことによって、動的にメインメニューを作成することもできます。ただこの方法は初心者向きではなく、かと言ってそれ以上の方であれば説明するまでもないと思います(「コントロールを実行時に作成する」が参考になります)。ですのでここでは、上記フォームデザイナを使った方法で紹介したこととほぼ同じことを行うコードのサンプルのみを紹介します。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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("「開く」が選択されました。");
}
  • 履歴:
  • 2014/9/25 レイアウトロジックを再開するコードをフォームデザイナが生成するコードを参考にして書き直した。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。