ここでは、ContextMenuStripコントロールを使用してコンテキストメニュー(ショートカットメニュー、ポップアップメニュー、右クリックメニュー)を表示する方法について説明します。ここでは、ごく基本的な事柄のみを説明します。
ContextMenuStripコントロールは、.NET Framework 2.0以降で使用できます。.NET Framework 1.1以前では、代わりにContextMenuコントロールを使用してください。
まずは、コンテキストメニューとして表示するContextMenuStripオブジェクトが必要です。ContextMenuStripオブジェクトを作成する方法を簡単に説明します。すでにご存じの方は、読み飛ばしてください。
Visual Studioのフォームデザイナでフォームを開き、ツールボックスから「ContextMenuStrip」をフォームにドラッグ&ドロップしてください。
するとフォームの上部に「ContextMenuStrip」という表示と、その下に「ここへ入力」と書かれた枠が表示されます。(表示されていない時は、フォームの下にある「ContextMenuStrip1」と書かれたアイコンをクリックするか、プロパティウィンドウで「ContextMenuStrip1」を選択してください。)
「ここへ入力」と書かれた部分をクリックして、メニュー項目として表示する文字列を入力し、Enterキーを押してください。これでメニュー項目が1つできました。
作成したメニュー項目の下と右に「ここへ入力」が表示されます。これらをクリックして文字列を入力することで、新しい項目を追加することができます。このようにして、必要なだけ項目を追加します。
区切り線(横棒)を追加する場合は、「-」(半角ハイフン)と入力してください。(または、「ここへ入力」の横に表示される下矢印をクリックして、「Separator」を選択してください。)
項目がクリックされた時に行う処理を記述するには、フォームデザイナでその項目をダブルクリックします。すると自動的にClickイベントハンドラが作成され、コードエディタが開きます。
以上です。ここでは最低限のことしか説明しませんでしたが、もう少し詳しい説明が欲しいという場合は、「フォームにメインメニューを付ける」をご覧ください。そちらはコンテキストメニューではなくメインメニューの説明ですが、メニュー項目に関する説明は同じです。
コンテキストメニューを表示したいコントロールのContextMenuStripプロパティにContextMenuStripオブジェクトを設定すると、そのコントロールを右クリックした時に、自動でコンテキストメニューが表示されるようになります。
Visual Studioを使用すれば、1行もコードを書かずに、コンテキストメニューを表示することができます。まず、先述したように、Visual Studioのフォームデザイナを使って、ContextMenuStripオブジェクトを作成します。次に、コンテキストメニューを表示させたいコントロールをフォームデザイナで選択します。そして、プロパティウィンドウでContextMenuStripプロパティを探し、ドロップダウンメニューからContextMenuStripを選択します。
.NET Frameworkに任せるのではなく、自分でコンテキストメニューを表示するには、Showメソッドを使用します。この時、表示する座標を指定する必要がありますが、この座標は画面上の座標(画面座標)とコントロール上の座標(クライアント座標)のどちらでも可能です。(「画面上の座標」と「コントロール上の座標」の意味が分からないという場合は、「画面座標をクライアント座標(コントロール上の座標)に変換する」をご覧ください。)
まずは、画面上の座標を指定して、コンテキストメニューを表示する例を示します。
'コンテキストメニューを表示する座標 Dim p As System.Drawing.Point = System.Windows.Forms.Cursor.Position '指定した画面上の座標位置にコンテキストメニューを表示する Me.contextMenuStrip1.Show(p) 'または、次のようにしても同じ 'Me.contextMenuStrip1.Show(p.X, p.Y)
//コンテキストメニューを表示する座標 System.Drawing.Point p = System.Windows.Forms.Cursor.Position; //指定した画面上の座標位置にコンテキストメニューを表示する this.contextMenuStrip1.Show(p); //または、次のようにしても同じ //this.contextMenuStrip1.Show(p.X, p.Y);
次に、コントロール上の座標でコンテキストメニューを表示する例を示します。
'コンテキストメニューを表示する座標 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)
//コンテキストメニューを表示する座標 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も同様です。
次の例では、マウスポインターの位置から左上にコンテキストメニューを表示しています。
'Imports System.Windows.Forms 'マウスポインターの位置から左上にコンテキストメニューを表示する Me.contextMenuStrip1.Show(Cursor.Position, ToolStripDropDownDirection.AboveLeft)
//using System.Windows.Forms; //マウスポインターの位置から左上にコンテキストメニューを表示する this.contextMenuStrip1.Show(Cursor.Position, ToolStripDropDownDirection.AboveLeft);
補足:表示されるコンテキストメニュー全体が画面に表示されるように自動的に位置が補正されるため、必ず指定した座標にコンテキストメニューが表示されるとは限りません。