コントロールの右クリックされた位置により、コンテキストメニューの内容を変えたいときなどに使えるテクニックです。
コンテキストメニューが表示される時、ContextMenuStrip.Openingイベントが発生します(詳しくは、「メニュー項目が表示される直前にメニュー項目のテキストや状態の変更を行う」)。この時、マウスカーソルの座標は、Control.MousePositionプロパティ(もしくはCursor.Positionプロパティ)で取得できます(詳しくは、「マウスポインタの位置を取得、変更(移動)する」)。
Control.MousePositionプロパティで取得できる座標は画面上の座標になります。もしコンテキストメニューを表示したコントロール上の座標で取得したい場合は、Control.PointToScreenメソッドを使用して座標を変換します(詳しくは、「画面座標をクライアント座標(コントロール上の座標)に変換する」)。なおコンテキストメニューを表示したコントロールは、ContextMenuStrip.SourceControlプロパティで取得できます(詳しくは、「どのコントロールを右クリックしてコンテキストメニューを表示したかを調べる」)。
以下の例では、ContextMenuStripが表示される直前にマウスポインタの座標を取得し、ContextMenuStripを表示しているコントロールのクライアント座標に変換してから、結果を表示しています。
'ContextMenuStrip1のOpeningイベントハンドラ Private Sub ContextMenuStrip1_Opening(sender As Object, e As CancelEventArgs) _ Handles ContextMenuStrip1.Opening Dim menu As ContextMenuStrip = DirectCast(sender, ContextMenuStrip) 'マウスカーソルの位置を画面座標で取得 Dim mp As Point = Control.MousePosition 'ContextMenuStripを表示しているコントロールのクライアント座標に変換 Dim cp As Point = menu.SourceControl.PointToClient(mp) '結果を表示 Console.WriteLine(cp) End Sub
//ContextMenuStrip1のOpeningイベントハンドラ private void ContextMenuStrip1_Opening(object sender, CancelEventArgs e) { ContextMenuStrip menu = (ContextMenuStrip)sender; //マウスカーソルの位置を画面座標で取得 Point mp = Control.MousePosition; //ContextMenuStripを表示しているコントロールのクライアント座標に変換 Point cp = menu.SourceControl.PointToClient(mp); //結果を表示 Console.WriteLine(cp); }