[C#] ContextMenuStripで階層メニューを作成する方法

C#でContextMenuStripを使用して階層メニューを作成するには、まずContextMenuStripオブジェクトを作成し、メニュー項目を追加します。

階層メニューを作成するには、ToolStripMenuItemを使用します。

親メニュー項目に対して子メニュー項目を追加することで階層を形成します。

具体的には、親のToolStripMenuItemDropDownItemsプロパティに子のToolStripMenuItemを追加します。

これにより、親メニュー項目をクリックすると子メニューが表示されるようになります。

ContextMenuStripは通常、右クリックメニューとして使用され、フォームやコントロールに関連付けて表示されます。

この記事でわかること
  • ContextMenuStripの基本的な使い方
  • 階層メニューの構築方法
  • メニュー項目の動的な変更方法
  • イベントハンドラの設定方法
  • メニュー項目のカスタマイズ手法

目次から探す

階層メニューの作成手順

ContextMenuStripの作成

C#のWindowsフォームアプリケーションで階層メニューを作成するには、まずContextMenuStripを作成します。

これは右クリックメニューを表示するためのコンポーネントです。

  1. Visual StudioのツールボックスからContextMenuStripをフォームにドラッグ&ドロップします。
  2. プロパティウィンドウで、NameプロパティをcontextMenuStrip1に設定します。

ToolStripMenuItemの追加

次に、ToolStripMenuItemを追加してメニュー項目を作成します。

これにより、メニューの各項目を定義できます。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // メニュー項目を作成
        ToolStripMenuItem parentItem = new ToolStripMenuItem("親メニュー");
        ToolStripMenuItem childItem = new ToolStripMenuItem("子メニュー");
        // 親メニューに子メニューを追加
        parentItem.DropDownItems.Add(childItem);
        // ContextMenuStripに親メニューを追加
        contextMenuStrip1.Items.Add(parentItem);
    }
}

このコードでは、親メニューと子メニューを作成し、親メニューに子メニューを追加しています。

階層メニューの構築

階層メニューを構築するためには、親メニュー項目と子メニュー項目を設定します。

親メニュー項目の設定

親メニュー項目は、他のメニュー項目を持つことができるメニューです。

以下のように設定します。

ToolStripMenuItem parentItem = new ToolStripMenuItem("親メニュー");

子メニュー項目の追加

子メニュー項目は、親メニュー項目の下に表示されるメニューです。

親メニューに子メニューを追加するには、DropDownItemsプロパティを使用します。

ToolStripMenuItem childItem = new ToolStripMenuItem("子メニュー");
parentItem.DropDownItems.Add(childItem);

メニュー項目のイベントハンドラ設定

メニュー項目がクリックされたときの動作を定義するために、イベントハンドラを設定します。

以下のように、メニュー項目にイベントを追加します。

childItem.Click += new EventHandler(ChildItem_Click);

イベントハンドラの実装は次のようになります。

private void ChildItem_Click(object sender, EventArgs e)
{
    MessageBox.Show("子メニューがクリックされました。");
}

このコードにより、子メニューがクリックされたときにメッセージボックスが表示されます。

実装例

シンプルな階層メニューの例

シンプルな階層メニューを作成するための基本的な実装例を示します。

この例では、親メニューとその下に1つの子メニューを持つ構造を作成します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // ContextMenuStripの作成
        ContextMenuStrip contextMenuStrip1 = new ContextMenuStrip();
        // 親メニュー項目の作成
        ToolStripMenuItem parentItem = new ToolStripMenuItem("親メニュー");
        ToolStripMenuItem childItem = new ToolStripMenuItem("子メニュー");
        // 親メニューに子メニューを追加
        parentItem.DropDownItems.Add(childItem);
        // ContextMenuStripに親メニューを追加
        contextMenuStrip1.Items.Add(parentItem);
        // フォームにContextMenuStripを関連付け
        this.ContextMenuStrip = contextMenuStrip1;
        // 子メニューのクリックイベントを設定
        childItem.Click += new EventHandler(ChildItem_Click);
    }
    private void ChildItem_Click(object sender, EventArgs e)
    {
        MessageBox.Show("子メニューがクリックされました。");
    }
}

このコードを実行すると、右クリックで「親メニュー」が表示され、その下に「子メニュー」が表示されます。

「子メニュー」をクリックすると、メッセージボックスが表示されます。

複数階層のメニューの例

複数階層のメニューを作成することで、より複雑なメニュー構造を実現できます。

以下の例では、親メニューの下にさらに子メニューを持つ構造を作成します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // ContextMenuStripの作成
        ContextMenuStrip contextMenuStrip1 = new ContextMenuStrip();
        // 親メニュー項目の作成
        ToolStripMenuItem parentItem = new ToolStripMenuItem("親メニュー");
        ToolStripMenuItem childItem1 = new ToolStripMenuItem("子メニュー1");
        ToolStripMenuItem childItem2 = new ToolStripMenuItem("子メニュー2");
        ToolStripMenuItem subChildItem = new ToolStripMenuItem("サブ子メニュー");
        // 子メニューにサブ子メニューを追加
        childItem1.DropDownItems.Add(subChildItem);
        // 親メニューに子メニューを追加
        parentItem.DropDownItems.Add(childItem1);
        parentItem.DropDownItems.Add(childItem2);
        // ContextMenuStripに親メニューを追加
        contextMenuStrip1.Items.Add(parentItem);
        // フォームにContextMenuStripを関連付け
        this.ContextMenuStrip = contextMenuStrip1;
        // イベントハンドラの設定
        childItem1.Click += new EventHandler(ChildItem1_Click);
        childItem2.Click += new EventHandler(ChildItem2_Click);
        subChildItem.Click += new EventHandler(SubChildItem_Click);
    }
    private void ChildItem1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("子メニュー1がクリックされました。");
    }
    private void ChildItem2_Click(object sender, EventArgs e)
    {
        MessageBox.Show("子メニュー2がクリックされました。");
    }
    private void SubChildItem_Click(object sender, EventArgs e)
    {
        MessageBox.Show("サブ子メニューがクリックされました。");
    }
}

このコードを実行すると、親メニューの下に2つの子メニューが表示され、さらに「子メニュー1」の下に「サブ子メニュー」が表示されます。

それぞれのメニューをクリックすると、対応するメッセージボックスが表示されます。

動的にメニュー項目を追加する例

動的にメニュー項目を追加することで、ユーザーの操作に応じてメニューを変更することができます。

以下の例では、ボタンをクリックすることで新しいメニュー項目を追加します。

partial class MyForm : Form
{
    private ContextMenuStrip contextMenuStrip1;
    public MyForm()
    {
        InitializeComponent();
        // ContextMenuStripの作成
        contextMenuStrip1 = new ContextMenuStrip();
        this.ContextMenuStrip = contextMenuStrip1;
        // ボタンの作成
        Button addButton = new Button();
        addButton.Text = "メニュー項目を追加";
        addButton.Click += new EventHandler(AddButton_Click);
        this.Controls.Add(addButton);
    }
    private void AddButton_Click(object sender, EventArgs e)
    {
        // 新しいメニュー項目を作成
        ToolStripMenuItem newItem = new ToolStripMenuItem("新しいメニュー項目");
        newItem.Click += new EventHandler(NewItem_Click);
        // ContextMenuStripに新しいメニュー項目を追加
        contextMenuStrip1.Items.Add(newItem);
    }
    private void NewItem_Click(object sender, EventArgs e)
    {
        MessageBox.Show("新しいメニュー項目がクリックされました。");
    }
}

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

追加されたメニュー項目をクリックすると、メッセージボックスが表示されます。

これにより、ユーザーの操作に応じてメニューを動的に変更することができます。

応用例

コンテキストメニューのカスタマイズ

コンテキストメニューをカスタマイズすることで、ユーザーにとって使いやすいインターフェースを提供できます。

以下の例では、メニュー項目の背景色やフォントスタイルを変更する方法を示します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // ContextMenuStripの作成
        ContextMenuStrip contextMenuStrip1 = new ContextMenuStrip();
        // メニュー項目の作成
        ToolStripMenuItem item1 = new ToolStripMenuItem("カスタムメニュー1");
        ToolStripMenuItem item2 = new ToolStripMenuItem("カスタムメニュー2");
        // メニュー項目のカスタマイズ
        item1.BackColor = Color.LightBlue; // 背景色を変更
        item2.Font = new Font("Arial", 10, FontStyle.Bold); // フォントスタイルを変更
        // ContextMenuStripにメニュー項目を追加
        contextMenuStrip1.Items.Add(item1);
        contextMenuStrip1.Items.Add(item2);
        // フォームにContextMenuStripを関連付け
        this.ContextMenuStrip = contextMenuStrip1;
    }
}

このコードを実行すると、カスタマイズされた背景色やフォントスタイルのメニュー項目が表示されます。

これにより、ユーザーは視覚的に異なるメニュー項目を識別しやすくなります。

アイコン付きメニュー項目の作成

アイコンをメニュー項目に追加することで、視覚的な情報を提供し、ユーザーの理解を助けることができます。

以下の例では、メニュー項目にアイコンを追加します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // ContextMenuStripの作成
        ContextMenuStrip contextMenuStrip1 = new ContextMenuStrip();
        // メニュー項目の作成
        ToolStripMenuItem item1 = new ToolStripMenuItem("メニュー1");
        ToolStripMenuItem item2 = new ToolStripMenuItem("メニュー2");
        // アイコンの設定
        item1.Image = Image.FromFile("icon1.png"); // アイコン画像を指定
        item2.Image = Image.FromFile("icon2.png"); // アイコン画像を指定
        // ContextMenuStripにメニュー項目を追加
        contextMenuStrip1.Items.Add(item1);
        contextMenuStrip1.Items.Add(item2);
        // フォームにContextMenuStripを関連付け
        this.ContextMenuStrip = contextMenuStrip1;
    }
}

このコードを実行すると、各メニュー項目に指定したアイコンが表示されます。

アイコンはユーザーにとって直感的な操作を促進します。

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

ショートカットキーを設定することで、ユーザーはキーボードを使って迅速にメニュー項目を選択できます。

以下の例では、メニュー項目にショートカットキーを設定します。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        // ContextMenuStripの作成
        ContextMenuStrip contextMenuStrip1 = new ContextMenuStrip();
        // メニュー項目の作成
        ToolStripMenuItem item1 = new ToolStripMenuItem("メニュー1");
        ToolStripMenuItem item2 = new ToolStripMenuItem("メニュー2");
        // ショートカットキーの設定
        item1.ShortcutKeys = Keys.Control | Keys.A; // Ctrl + A
        item2.ShortcutKeys = Keys.Control | Keys.B; // Ctrl + B
        // ContextMenuStripにメニュー項目を追加
        contextMenuStrip1.Items.Add(item1);
        contextMenuStrip1.Items.Add(item2);
        // フォームにContextMenuStripを関連付け
        this.ContextMenuStrip = contextMenuStrip1;
        // イベントハンドラの設定
        item1.Click += new EventHandler(Item1_Click);
        item2.Click += new EventHandler(Item2_Click);
    }
    private void Item1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("メニュー1が選択されました。");
    }
    private void Item2_Click(object sender, EventArgs e)
    {
        MessageBox.Show("メニュー2が選択されました。");
    }
}

このコードを実行すると、Ctrl + Aで「メニュー1」、Ctrl + Bで「メニュー2」を選択できるようになります。

ショートカットキーを設定することで、ユーザーはメニュー項目をより迅速に操作できます。

よくある質問

ContextMenuStripをフォームに関連付けるにはどうすればいいですか?

ContextMenuStripをフォームに関連付けるには、以下の手順を実行します。

  1. ContextMenuStripを作成: Visual StudioのツールボックスからContextMenuStripをフォームにドラッグ&ドロップします。
  2. プロパティの設定: 作成したContextMenuStripNameプロパティを設定します(例: contextMenuStrip1)。
  3. フォームに関連付け: フォームのコンストラクタ内で、this.ContextMenuStrip = contextMenuStrip1;を追加します。

これにより、フォーム上で右クリックした際に、指定したContextMenuStripが表示されるようになります。

階層メニューの項目を動的に変更するには?

階層メニューの項目を動的に変更するには、以下の手順を実行します。

  1. メニュー項目の取得: 変更したいメニュー項目を取得します。

例えば、ToolStripMenuItemのリストから特定の項目を選択します。

  1. プロパティの変更: 取得したメニュー項目のTextプロパティやVisibleプロパティを変更します。
// メニュー項目のテキストを変更
parentItem.Text = "新しい親メニュー名";

このようにすることで、ユーザーの操作に応じてメニュー項目を動的に変更することができます。

メニュー項目のクリックイベントを処理する方法は?

メニュー項目のクリックイベントを処理するには、以下の手順を実行します。

  1. イベントハンドラの作成: メニュー項目に対してクリックイベントのハンドラを作成します。
  2. イベントの関連付け: メニュー項目のClickイベントに、作成したハンドラを関連付けます。
// メニュー項目のクリックイベントを設定
childItem.Click += new EventHandler(ChildItem_Click);
// イベントハンドラの実装
private void ChildItem_Click(object sender, EventArgs e)
{
    MessageBox.Show("メニュー項目がクリックされました。");
}

このように設定することで、メニュー項目がクリックされた際に指定した処理を実行することができます。

まとめ

この記事では、C#のWindowsフォームプログラミングにおけるContextMenuStripを使用した階層メニューの作成方法について詳しく解説しました。

具体的には、シンプルな階層メニューの実装から、複数階層のメニュー、動的なメニュー項目の追加、さらにはカスタマイズやアイコンの設定、ショートカットキーの利用方法まで幅広く取り上げました。

これらの知識を活用することで、ユーザーにとって使いやすいインターフェースを提供することが可能になりますので、ぜひ実際のプロジェクトに取り入れてみてください。

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

関連カテゴリーから探す

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