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

コンテキストメニューを表示する

ここでは、ContextMenuStripコントロールを使用してコンテキストメニュー(ショートカットメニュー、ポップアップメニュー、右クリックメニュー)を表示する方法について説明します。ここでは、ごく基本的な事柄のみを説明します。

コンテキストメニュー

ContextMenuStripコントロールは、.NET Framework 2.0以降で使用できます。.NET Framework 1.1以前では、代わりにContextMenuコントロールを使用してください。

ContextMenuStripオブジェクトを作成する

まずは、コンテキストメニューとして表示するContextMenuStripオブジェクトが必要です。ContextMenuStripオブジェクトを作成する方法を簡単に説明します。すでにご存じの方は、読み飛ばしてください。

Visual Studioのフォームデザイナでフォームを開き、ツールボックスから「ContextMenuStrip」をフォームにドラッグ&ドロップしてください。

ツールボックスでContextMenuStripを選択

するとフォームの上部に「ContextMenuStrip」という表示と、その下に「ここへ入力」と書かれた枠が表示されます。(表示されていない時は、フォームの下にある「ContextMenuStrip1」と書かれたアイコンをクリックするか、プロパティウィンドウで「ContextMenuStrip1」を選択してください。)

フォームにContextMenuStripを追加

「ここへ入力」と書かれた部分をクリックして、メニュー項目として表示する文字列を入力し、Enterキーを押してください。これでメニュー項目が1つできました。

ContextMenuStripに項目を1つ追加

作成したメニュー項目の下と右に「ここへ入力」が表示されます。これらをクリックして文字列を入力することで、新しい項目を追加することができます。このようにして、必要なだけ項目を追加します。

ContextMenuStripにさらに項目を追加

区切り線(横棒)を追加する場合は、「-」(半角ハイフン)と入力してください。(または、「ここへ入力」の横に表示される下矢印をクリックして、「Separator」を選択してください。)

ContextMenuStripに区切り線を追加

項目がクリックされた時に行う処理を記述するには、フォームデザイナでその項目をダブルクリックします。すると自動的にClickイベントハンドラが作成され、コードエディタが開きます。

以上です。ここでは最低限のことしか説明しませんでしたが、もう少し詳しい説明が欲しいという場合は、「フォームにメインメニューを付ける」をご覧ください。そちらはコンテキストメニューではなくメインメニューの説明ですが、メニュー項目に関する説明は同じです。

コントロールを右クリックした時に、コンテキストメニューが自動的に表示されるようにする

コンテキストメニューを表示したいコントロールのContextMenuStripプロパティにContextMenuStripオブジェクトを設定すると、そのコントロールを右クリックした時に、自動でコンテキストメニューが表示されるようになります。

Visual Studioを使用すれば、1行もコードを書かずに、コンテキストメニューを表示することができます。まず、先述したように、Visual Studioのフォームデザイナを使って、ContextMenuStripオブジェクトを作成します。次に、コンテキストメニューを表示させたいコントロールをフォームデザイナで選択します。そして、プロパティウィンドウでContextMenuStripプロパティを探し、ドロップダウンメニューからContextMenuStripを選択します。

プロパティウィンドウでContextMenuStripプロパティを設定

自分でコンテキストメニューを表示する

.NET Frameworkに任せるのではなく、自分でコンテキストメニューを表示するには、Showメソッドを使用します。この時、表示する座標を指定する必要がありますが、この座標は画面上の座標(画面座標)とコントロール上の座標(クライアント座標)のどちらでも可能です。(「画面上の座標」と「コントロール上の座標」の意味が分からないという場合は、「画面座標をクライアント座標(コントロール上の座標)に変換する」をご覧ください。)

まずは、画面上の座標を指定して、コンテキストメニューを表示する例を示します。

VB.NET
コードを隠すコードを選択
'コンテキストメニューを表示する座標
Dim p As System.Drawing.Point = System.Windows.Forms.Cursor.Position

'指定した画面上の座標位置にコンテキストメニューを表示する
Me.contextMenuStrip1.Show(p)

'または、次のようにしても同じ
'Me.contextMenuStrip1.Show(p.X, p.Y)
C#
コードを隠すコードを選択
//コンテキストメニューを表示する座標
System.Drawing.Point p = System.Windows.Forms.Cursor.Position;

//指定した画面上の座標位置にコンテキストメニューを表示する
this.contextMenuStrip1.Show(p);

//または、次のようにしても同じ
//this.contextMenuStrip1.Show(p.X, p.Y);

次に、コントロール上の座標でコンテキストメニューを表示する例を示します。

VB.NET
コードを隠すコードを選択
'コンテキストメニューを表示する座標
Dim p As New System.Drawing.Point(50, 10)

'button1上の座標位置にコンテキストメニューを表示する
Me.contextMenuStrip1.Show(Me.button1, p)

'または、次のようにしても同じ
'Me.contextMenuStrip1.Show(Me.button1, p.X, p.Y)
C#
コードを隠すコードを選択
//コンテキストメニューを表示する座標
System.Drawing.Point p = new System.Drawing.Point(50, 10);

//button1上の座標位置にコンテキストメニューを表示する
this.contextMenuStrip1.Show(this.button1, p);

//または、次のようにしても同じ
//this.contextMenuStrip1.Show(this.button1, p.X, p.Y);
補足:コントロールを指定してShowメソッドを呼び出すと、そのコントロールがContextMenuStrip.SourceControlプロパティに設定されます。

コンテキストメニューを表示する方向を指定する

上記のようにしてコンテキストメニューを表示した場合、指定した座標の右下にコンテキストメニューが表示されます。もし左上などに表示したい場合は、Showメソッドを呼び出す際に、ToolStripDropDownDirectionを指定します。

コンテキストメニューを指定された座標の左上に表示したい時はAboveLeft、右上の時はAboveRight、左下の時はBelowLeftかLeft、右下(デフォルト)の時はBelowRightかRightかDefaultを指定します。

補足:MSDNによると、ToolStripDropDownDirection.Defaultは「入れ子になったドロップダウン コントロールを考慮し、RightToLeft の設定に応じて、Left または Right を指定します。」とされています。しかし私が試した限りでは、ContextMenuStripのRightToLeftプロパティをYesにしても表示位置に変化はなく、右下に表示されました。またToolStripDropDownDirection.Leftは、MSDNによると「入れ子になったドロップダウン コントロールを考慮して、ToolStripDropDown を親コントロールの右側に表示するよう指定します。」とありますが、私が試した限りでは、BelowLeftと違いがみられませんでした。BelowRightとRightも同様です。

次の例では、マウスポインターの位置から左上にコンテキストメニューを表示しています。

マウスポインターの左上に表示したコンテキストメニュー

VB.NET
コードを隠すコードを選択
'Imports System.Windows.Forms

'マウスポインターの位置から左上にコンテキストメニューを表示する
Me.contextMenuStrip1.Show(Cursor.Position, ToolStripDropDownDirection.AboveLeft)
C#
コードを隠すコードを選択
//using System.Windows.Forms;

//マウスポインターの位置から左上にコンテキストメニューを表示する
this.contextMenuStrip1.Show(Cursor.Position,
    ToolStripDropDownDirection.AboveLeft);
補足:表示されるコンテキストメニュー全体が画面に表示されるように自動的に位置が補正されるため、必ず指定した座標にコンテキストメニューが表示されるとは限りません。

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

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