標準のコンテキストメニューを利用する (ContextMenuStripでない従来のメニューの使用) - C#

現在のVisual Studioの最新版(Visual Studio 2013)ではコンテキストメニューにContextMenuStripを使用することを推奨していますが、この記事では従来のコンテキストメニューを利用するための手順を紹介します。

概要

Visual Studio 2010以降ではコンテキストメニューに ContextMenuStripを使用するのがデフォルトになっています。
ContextMenuStripを使用すると立体的な表示で高機能なメニューを利用できます。


通常の利用であれば問題ないのですが、従来のコンテキストメニューを使用したい場合があります。この記事では従来のコンテキストメニューであるContextMenuコントロールを利用する手順を紹介します。

手順

Visual Studioを起動し、Windowsフォームアプリケーションを新規作成します。


左側のツールボックスウィンドウで右クリックし、ポップアップメニューを表示します。メニューの[アイテムの選択]をクリックします。


[ツールボックス アイテムの選択]ダイアログが表示されます。上部のタブの[.NET Framework コンポーネント]を選択します。


リストビューにコンポーネントの一覧が表示されます。"ContextMenu"コンポーネントを探します。"ContextMenu"コンポーネントの左側のチェックボックスにチェックします。チェック後[OK]ボタンを押してダイアログを閉じます。


Visual Studioのウィンドウに戻ります。


ツールボックスのウィンドウに"ContextMenu"コンポーネントが追加されていることが確認できます。


ツールボックスの"ContextMenu"をフォームデザイナのウィンドウにドラッグ&ドロップします。フォームデザイナの下部に"contextMenu1"コンポーネントが追加されます。


コンテキストメニューを表示させるためのテキストボックスを配置します。


コンテキストメニューを編集します。編集は、追加されたContextMenuのインスタンスオブジェクトである"contextMenu1"を選択し右クリックして表示されるポップアップメニューの"[編集] メニュー"を選択します。


コンテキストメニューの編集画面が表示されますので、メニューを追加するなどの編集をします。


先に配置したTextBoxとContextMenuを関連付けます。


TextBoxのプロパティを確認すると、Visual Studio 2013ではコンテキストメニューを設定するプロパティがプロパティウィンドウには表示されないことが確認できます。ContextMenuStripを関連付けるためのContextMenuStripプロパティのみあります。

ContextMenuとウィンドウコントロールを関連付けるコード

プロパティウィンドウで設定できないため、コードで記述します。ここでは2つの方法を紹介します。

1:フォームのロジックに記述する

フォームのLoad時にテキストボックスのContextMenuプロパティにContextMenuコントロールのインスタンスオブジェクトを設定します。


コードは下記になります。
FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ContextMenuDemo
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void FormMain_Load(object sender, EventArgs e)
    {
      textBox1.ContextMenu = contextMenu1;
    }
  }
}

2:フォームのデザイナ部のコードに記述する

プロパティウィンドウで設定したときと同じように、フォームのデザイナのコードに記述する方法もあります。


コードは下記になります。
FormMain.Designer.cs
namespace ContextMenuDemo
{
  partial class FormMain
  {
    /// <summary>
    /// 必要なデザイナー変数です。
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// 使用中のリソースをすべてクリーンアップします。
    /// </summary>
    /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
    protected override void Dispose(bool disposing)
    {
      if (disposing && (components != null)) {
        components.Dispose();
      }
      base.Dispose(disposing);
    }

    #region Windows フォーム デザイナーで生成されたコード

    /// <summary>
    /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
    /// コード エディターで変更しないでください。
    /// </summary>
    private void InitializeComponent()
    {
      this.contextMenu1 = new System.Windows.Forms.ContextMenu();
      this.textBox1 = new System.Windows.Forms.TextBox();
      this.menuItem1 = new System.Windows.Forms.MenuItem();
      this.menuItem2 = new System.Windows.Forms.MenuItem();
      this.menuItem3 = new System.Windows.Forms.MenuItem();
      this.SuspendLayout();
      // 
      // contextMenu1
      // 
      this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuItem1,
            this.menuItem2,
            this.menuItem3});
      // 
      // textBox1
      // 
      this.textBox1.Location = new System.Drawing.Point(12, 12);
      this.textBox1.Name = "textBox1";
      this.textBox1.Size = new System.Drawing.Size(100, 19);
      this.textBox1.TabIndex = 0;
      this.textBox1.ContextMenu = contextMenu1; //ここを追加
      // 
      // menuItem1
      // 
      this.menuItem1.Index = 0;
      this.menuItem1.Text = "メニューA";
      // 
      // menuItem2
      // 
      this.menuItem2.Index = 1;
      this.menuItem2.Text = "メニューB";
      // 
      // menuItem3
      // 
      this.menuItem3.Index = 2;
      this.menuItem3.Text = "メニューC";
      // 
      // FormMain
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
      this.ClientSize = new System.Drawing.Size(336, 162);
      this.Controls.Add(this.textBox1);
      this.Name = "FormMain";
      this.Text = "Form1";
      this.Load += new System.EventHandler(this.FormMain_Load);
      this.ResumeLayout(false);
      this.PerformLayout();

    }

    #endregion

    private System.Windows.Forms.ContextMenu contextMenu1;
    private System.Windows.Forms.MenuItem menuItem1;
    private System.Windows.Forms.MenuItem menuItem2;
    private System.Windows.Forms.MenuItem menuItem3;
    private System.Windows.Forms.TextBox textBox1;
  }
}

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


テキストボックスをクリックしてフォーカスをテキストボックスに移します。右クリックするとポップアップメニューが表示されます。先のContextMenuStripとはデザインが違うことがわかります。


ContextMenuの利用ができました。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2015-02-26
iPentec all rights reserverd.