[C#] menustripで階層化されたメニューを作成する

C#でMenuStripを使用して階層化されたメニューを作成するには、MenuStripコントロールをフォームに追加し、ToolStripMenuItemを使ってメニュー項目を階層的に配置します。

まず、MenuStripをフォームにドラッグアンドドロップで追加します。

次に、ToolStripMenuItemMenuStripに追加し、メニュー項目を設定します。

階層化するには、親メニュー項目のDropDownItemsプロパティに子メニュー項目を追加します。

これにより、親メニューをクリックすると子メニューが表示される階層構造が作成されます。

デザインビューでの操作が簡単ですが、コードで動的に追加することも可能です。

この記事でわかること
  • C#での階層化メニューの作成方法
  • MenuStripとContextMenuStripの違い
  • メニュー項目の動的操作方法
  • コンテキストメニューの実装手法
  • メニューのカスタマイズとスタイリング方法

目次から探す

階層化メニューの作成

C#のWindowsフォームアプリケーションにおいて、階層化されたメニューを作成するためには、MenuStripコントロールを使用します。

このセクションでは、ToolStripMenuItemの追加方法や子メニューの作成方法、デザインと配置について詳しく解説します。

ToolStripMenuItemの追加

まず、MenuStripをフォームに追加し、メニュー項目を作成します。

以下のサンプルコードでは、Fileメニューを追加しています。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        
        // MenuStripの作成
        MenuStrip menuStrip = new MenuStrip();
        
        // ToolStripMenuItemの作成
        ToolStripMenuItem fileMenuItem = new ToolStripMenuItem("ファイル");
        
        // MenuStripにToolStripMenuItemを追加
        menuStrip.Items.Add(fileMenuItem);
        
        // フォームにMenuStripを追加
        this.MainMenuStrip = menuStrip;
        this.Controls.Add(menuStrip);
    }
}

このコードを実行すると、フォームに「ファイル」というメニューが表示されます。

子メニューの作成方法

次に、作成したメニューに子メニューを追加します。

以下のサンプルコードでは、「ファイル」メニューに「新規作成」と「終了」の子メニューを追加しています。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        
        // MenuStripの作成
        MenuStrip menuStrip = new MenuStrip();
        
        // ToolStripMenuItemの作成
        ToolStripMenuItem fileMenuItem = new ToolStripMenuItem("ファイル");
        
        // 子メニューの作成
        ToolStripMenuItem newMenuItem = new ToolStripMenuItem("新規作成");
        ToolStripMenuItem exitMenuItem = new ToolStripMenuItem("終了");
        
        // 子メニューを親メニューに追加
        fileMenuItem.DropDownItems.Add(newMenuItem);
        fileMenuItem.DropDownItems.Add(exitMenuItem);
        
        // MenuStripにToolStripMenuItemを追加
        menuStrip.Items.Add(fileMenuItem);
        
        // フォームにMenuStripを追加
        this.MainMenuStrip = menuStrip;
        this.Controls.Add(menuStrip);
    }
}

このコードを実行すると、「ファイル」メニューをクリックした際に「新規作成」と「終了」の子メニューが表示されます。

階層化メニューのデザインと配置

階層化メニューのデザインや配置をカスタマイズすることも可能です。

以下のサンプルコードでは、メニューのフォントや色を変更しています。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        
        // MenuStripの作成
        MenuStrip menuStrip = new MenuStrip();
        
        // ToolStripMenuItemの作成
        ToolStripMenuItem fileMenuItem = new ToolStripMenuItem("ファイル");
        
        // 子メニューの作成
        ToolStripMenuItem newMenuItem = new ToolStripMenuItem("新規作成");
        ToolStripMenuItem exitMenuItem = new ToolStripMenuItem("終了");
        
        // 子メニューを親メニューに追加
        fileMenuItem.DropDownItems.Add(newMenuItem);
        fileMenuItem.DropDownItems.Add(exitMenuItem);
        
        // MenuStripにToolStripMenuItemを追加
        menuStrip.Items.Add(fileMenuItem);
        
        // メニューのデザインをカスタマイズ
        menuStrip.BackColor = Color.LightGray; // 背景色を変更
        menuStrip.Font = new Font("Arial", 10, FontStyle.Bold); // フォントを変更
        
        // フォームにMenuStripを追加
        this.MainMenuStrip = menuStrip;
        this.Controls.Add(menuStrip);
    }
}

このコードを実行すると、メニューの背景色が薄い灰色に、フォントが太字のArialに変更されます。

これにより、ユーザーインターフェースがより魅力的になります。

コードによるMenuStripの操作

C#のWindowsフォームアプリケーションでは、MenuStripをコードで操作することができます。

このセクションでは、動的にMenuStripを生成する方法、メニュー項目の追加と削除、メニュー項目のイベント処理について解説します。

動的にMenuStripを生成する方法

MenuStripを動的に生成するには、フォームのコンストラクタ内でMenuStripとそのメニュー項目を作成します。

以下のサンプルコードでは、MenuStripを動的に生成し、メニュー項目を追加しています。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        
        // MenuStripの作成
        MenuStrip menuStrip = new MenuStrip();
        
        // ToolStripMenuItemの作成
        ToolStripMenuItem fileMenuItem = new ToolStripMenuItem("ファイル");
        ToolStripMenuItem editMenuItem = new ToolStripMenuItem("編集");
        
        // MenuStripにToolStripMenuItemを追加
        menuStrip.Items.Add(fileMenuItem);
        menuStrip.Items.Add(editMenuItem);
        
        // フォームにMenuStripを追加
        this.MainMenuStrip = menuStrip;
        this.Controls.Add(menuStrip);
    }
}

このコードを実行すると、フォームに「ファイル」と「編集」のメニューが表示されます。

メニュー項目の追加と削除

既存のMenuStripにメニュー項目を追加したり、削除したりすることも可能です。

以下のサンプルコードでは、ボタンをクリックすることでメニュー項目を追加し、別のボタンで削除する機能を実装しています。

partial class MyForm : Form
{
    private MenuStrip menuStrip;
    private ToolStripMenuItem fileMenuItem;
    public MyForm()
    {
        InitializeComponent();
        
        // MenuStripの作成
        menuStrip = new MenuStrip();
        fileMenuItem = new ToolStripMenuItem("ファイル");
        
        // MenuStripにToolStripMenuItemを追加
        menuStrip.Items.Add(fileMenuItem);
        
        // フォームにMenuStripを追加
        this.MainMenuStrip = menuStrip;
        this.Controls.Add(menuStrip);
        
        // ボタンの作成
        Button addButton = new Button { Text = "メニュー項目追加" };
        addButton.Click += AddMenuItem;
        this.Controls.Add(addButton);
        
        Button removeButton = new Button { Text = "メニュー項目削除" };
        removeButton.Click += RemoveMenuItem;
        this.Controls.Add(removeButton);
    }
    private void AddMenuItem(object sender, EventArgs e)
    {
        ToolStripMenuItem newItem = new ToolStripMenuItem("新しい項目");
        fileMenuItem.DropDownItems.Add(newItem);
    }
    private void RemoveMenuItem(object sender, EventArgs e)
    {
        if (fileMenuItem.DropDownItems.Count > 0)
        {
            fileMenuItem.DropDownItems.RemoveAt(fileMenuItem.DropDownItems.Count - 1);
        }
    }
}

このコードを実行すると、「メニュー項目追加」ボタンをクリックすることで「新しい項目」が追加され、「メニュー項目削除」ボタンをクリックすることで最後の項目が削除されます。

メニュー項目のイベント処理

メニュー項目にイベント処理を追加することで、ユーザーの操作に応じたアクションを実行できます。

以下のサンプルコードでは、「新規作成」メニュー項目にクリックイベントを追加しています。

partial class MyForm : Form
{
    private MenuStrip menuStrip;
    private ToolStripMenuItem fileMenuItem;
    public MyForm()
    {
        InitializeComponent();
        
        // MenuStripの作成
        menuStrip = new MenuStrip();
        fileMenuItem = new ToolStripMenuItem("ファイル");
        
        // 子メニューの作成
        ToolStripMenuItem newMenuItem = new ToolStripMenuItem("新規作成");
        newMenuItem.Click += NewMenuItem_Click; // イベント処理を追加
        
        // 子メニューを親メニューに追加
        fileMenuItem.DropDownItems.Add(newMenuItem);
        
        // MenuStripにToolStripMenuItemを追加
        menuStrip.Items.Add(fileMenuItem);
        
        // フォームにMenuStripを追加
        this.MainMenuStrip = menuStrip;
        this.Controls.Add(menuStrip);
    }
    private void NewMenuItem_Click(object sender, EventArgs e)
    {
        MessageBox.Show("新規作成が選択されました。");
    }
}

このコードを実行すると、「新規作成」メニュー項目をクリックした際にメッセージボックスが表示されます。

これにより、ユーザーの操作に対して適切な反応を示すことができます。

応用例

C#のWindowsフォームアプリケーションにおけるMenuStripの応用例として、コンテキストメニューの作成、メニューのカスタマイズとスタイリング、ショートカットキーの設定について解説します。

コンテキストメニューの作成

コンテキストメニューは、右クリック時に表示されるメニューです。

ContextMenuStripを使用して作成します。

以下のサンプルコードでは、右クリックで表示されるコンテキストメニューを作成しています。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        
        // ContextMenuStripの作成
        ContextMenuStrip contextMenu = new ContextMenuStrip();
        
        // メニュー項目の作成
        ToolStripMenuItem copyMenuItem = new ToolStripMenuItem("コピー");
        ToolStripMenuItem pasteMenuItem = new ToolStripMenuItem("貼り付け");
        
        // メニュー項目をContextMenuStripに追加
        contextMenu.Items.Add(copyMenuItem);
        contextMenu.Items.Add(pasteMenuItem);
        
        // フォームにContextMenuStripを設定
        this.ContextMenuStrip = contextMenu;
    }
}

このコードを実行すると、フォーム上で右クリックした際に「コピー」と「貼り付け」のメニューが表示されます。

メニューのカスタマイズとスタイリング

メニューの外観をカスタマイズすることで、アプリケーションのデザインを向上させることができます。

以下のサンプルコードでは、メニューの背景色やフォントを変更しています。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        
        // MenuStripの作成
        MenuStrip menuStrip = new MenuStrip();
        
        // ToolStripMenuItemの作成
        ToolStripMenuItem fileMenuItem = new ToolStripMenuItem("ファイル");
        
        // MenuStripにToolStripMenuItemを追加
        menuStrip.Items.Add(fileMenuItem);
        
        // メニューのカスタマイズ
        menuStrip.BackColor = Color.LightBlue; // 背景色を変更
        menuStrip.ForeColor = Color.White; // 文字色を変更
        menuStrip.Font = new Font("Arial", 10, FontStyle.Bold); // フォントを変更
        
        // フォームにMenuStripを追加
        this.MainMenuStrip = menuStrip;
        this.Controls.Add(menuStrip);
    }
}

このコードを実行すると、メニューの背景色が薄い青色に、文字色が白色に変更され、フォントが太字のArialになります。

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

メニュー項目にショートカットキーを設定することで、ユーザーがキーボードを使って迅速に操作できるようになります。

以下のサンプルコードでは、「新規作成」メニュー項目にショートカットキーを設定しています。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        
        // MenuStripの作成
        MenuStrip menuStrip = new MenuStrip();
        
        // ToolStripMenuItemの作成
        ToolStripMenuItem fileMenuItem = new ToolStripMenuItem("ファイル");
        
        // 子メニューの作成
        ToolStripMenuItem newMenuItem = new ToolStripMenuItem("新規作成");
        newMenuItem.ShortcutKeys = Keys.Control | Keys.N; // ショートカットキーを設定
        
        // 子メニューを親メニューに追加
        fileMenuItem.DropDownItems.Add(newMenuItem);
        
        // MenuStripにToolStripMenuItemを追加
        menuStrip.Items.Add(fileMenuItem);
        
        // フォームにMenuStripを追加
        this.MainMenuStrip = menuStrip;
        this.Controls.Add(menuStrip);
    }
}

このコードを実行すると、「新規作成」メニュー項目にCtrl + Nのショートカットキーが設定され、ユーザーはキーボードを使って迅速にこの機能を呼び出すことができます。

よくある質問

MenuStripとContextMenuStripの違いは?

MenuStripContextMenuStripは、どちらもメニューを表示するためのコントロールですが、以下のような違いがあります。

  • MenuStrip:
  • アプリケーションの上部に常に表示されるメニューです。
  • メインメニューとして使用され、通常はアプリケーションの機能を整理するために使用されます。
  • メニュー項目は、ユーザーがクリックすることで展開されます。
  • ContextMenuStrip:
  • 右クリック時に表示されるメニューです。
  • 特定のコンテキスト(状況)に応じた操作を提供するために使用されます。
  • ユーザーが特定のオブジェクトや領域を右クリックすることで表示されます。

階層化メニューのパフォーマンスに影響はある?

階層化メニューのパフォーマンスに影響を与える要因はいくつかありますが、一般的には以下の点に注意が必要です。

  • メニュー項目の数: 階層化メニューに多くの項目を追加すると、表示や操作に時間がかかることがあります。

特に、サブメニューが多層にわたる場合、ユーザーがメニューを展開する際に遅延を感じることがあります。

  • イベント処理: メニュー項目に複雑なイベント処理を追加すると、パフォーマンスに影響を与える可能性があります。

特に、メニューが表示されるたびに重い処理が行われる場合は注意が必要です。

  • 描画の最適化: メニューの描画が最適化されていない場合、パフォーマンスが低下することがあります。

必要のない描画処理を避けることが重要です。

メニュー項目の非表示や無効化はどうするの?

メニュー項目を非表示にしたり無効化したりすることは、ユーザーインターフェースの操作性を向上させるために重要です。

以下の方法で実現できます。

  • 非表示にする: Visibleプロパティを使用して、メニュー項目を非表示にすることができます。
  • 例: menuItem.Visible = false;
  • 無効化する: Enabledプロパティを使用して、メニュー項目を無効化することができます。

無効化された項目は、ユーザーが選択できなくなります。

  • 例: menuItem.Enabled = false;

これにより、特定の条件下でメニュー項目を表示したり、無効化したりすることが可能になります。

まとめ

この記事では、C#のWindowsフォームプログラミングにおけるMenuStripの使い方や応用例について詳しく解説しました。

階層化メニューの作成方法や、動的にメニューを生成する技術、さらにはコンテキストメニューやショートカットキーの設定方法についても触れました。

これらの知識を活用することで、より使いやすく魅力的なユーザーインターフェースを構築することが可能です。

ぜひ、実際のプロジェクトに取り入れて、ユーザー体験を向上させてみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す