現在のWindowsでは、もう定番ともいえる「右クリックメニュー」ですが、C#でもこの機能を扱うことができます。
題名に「右クリックメニュー」と書いていますが、正式名称は「コンテキストメニュー」です。
.NET Framework(C#)でもコントロール名はContextMenuStrip(System.Windows.Forms名前空間)です。
「作りたいのは”メニュー”じゃない」
Windowsアプリケーションには、よく「メニュー」を搭載したアプリケーションがあります。
なぜ、ここでこのようなことを書いているかというと、フォームデザイナにコンテキストメニューを置いたときに、メニューととても良く似た表示になるからです。
まず、Visual StudioでWindowsフォームアプリケーションを用意します。

ここに、[ツールボックス]の「メニューとツールバー」からフォームにContextMenuStripをD&D(ドラッグアンドドロップ)でフォームに置きます。

置き終わると、デザイナは下記のような表示になります。

「あれ?間違えた?」「置いたのはメニューじゃないのに・・・」と思われるかもしれません、ご安心下さい。これで、ちゃんと「コンテキストメニュー」をフォームに配置できています。
メニューをフォームに配置したときのデザイナ画面は、このようになっています(ちょっと無愛想ですね)。

さらに、メニューを載せたフォームにコンテキストメニューを置くと下図のようになります。
(見づらいかもしれませんが、通常のメニューと2段になっています)

使ってみる
サンプルコードは、下記のようになります。
/// <summary>
/// コンストラクタ
/// </summary>
public frmMain()
{
InitializeComponent();
// コンテキストメニューを生成します
this.contextMenuStrip1.Items.Add("メニュー1", null, this.ContextMenu_Click);
this.contextMenuStrip1.Items.Add("メニュー2", null, this.ContextMenu_Click);
this.contextMenuStrip1.Items.Add("メニュー3", null, this.ContextMenu_Click);
// このフォームのコンテキストメニューとして登録しておきます
// (こうすることで右クリックしたときに
// コンテキストメニューが表示されるようになります)
this.ContextMenuStrip = this.contextMenuStrip1;
}
/// <summary>
/// フォームがロードされたときの処理
/// </summary>
/// <param name="sender">送信元オブジェクト</param>
/// <param name="e">イベントオブジェクト</param>
private void frmMain_Load(object sender, EventArgs e)
{
//
}
/// <summary>
/// [Exit]ボタンが押されたときの処理
/// </summary>
/// <param name="sender">送信元オブジェクト</param>
/// <param name="e">イベントオブジェクト</param>
private void btnExit_Click(object sender, EventArgs e)
{
//
this.Close();
}
/// <summary>
/// コンテキストメニューが押されたときの処理
/// </summary>
/// <param name="sender">送信元オブジェクト</param>
/// <param name="e">イベントオブジェクト</param>
private void ContextMenu_Click(object sender, EventArgs e)
{
System.Windows.Forms.ToolStripMenuItem item = (System.Windows.Forms.ToolStripMenuItem)sender;
string message = item.Text + " が押されました";
MessageBox.Show(this, message, "メニュー", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
コンテキストメニューを使えるようにするには大事なことが3つあります。
- コンテキストメニューの項目を作る
- コンテキストメニュー項目をクリックしたときの処理を実装する
- コンテキストメニューをフォームに登録する
「1. コンテキストメニューの項目を作る」と「2. コンテキストメニュー項目をクリックしたときの処理を実装する」は、コンテキストメニューを作るので、そこに入れる項目は作ると思います。
意外に忘れてしまうのが、「3. コンテキストメニューをフォームに登録する」です。
コードであれば1行、デザイナであればプロパティでできますので、忘れないようにしましょう。


