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

コントロールを右クリックしてコンテキストメニューが表示された時、クリックされた座標を調べる

コントロールの右クリックされた位置により、コンテキストメニューの内容を変えたいときなどに使えるテクニックです。

コンテキストメニューが表示される時、ContextMenuStrip.Openingイベントが発生します(詳しくは、「メニュー項目が表示される直前にメニュー項目のテキストや状態の変更を行う」)。この時、マウスカーソルの座標は、Control.MousePositionプロパティ(もしくはCursor.Positionプロパティ)で取得できます(詳しくは、「マウスポインタの位置を取得、変更(移動)する」)。

Control.MousePositionプロパティで取得できる座標は画面上の座標になります。もしコンテキストメニューを表示したコントロール上の座標で取得したい場合は、Control.PointToScreenメソッドを使用して座標を変換します(詳しくは、「画面座標をクライアント座標(コントロール上の座標)に変換する」)。なおコンテキストメニューを表示したコントロールは、ContextMenuStrip.SourceControlプロパティで取得できます(詳しくは、「どのコントロールを右クリックしてコンテキストメニューを表示したかを調べる」)。

以下の例では、ContextMenuStripが表示される直前にマウスポインタの座標を取得し、ContextMenuStripを表示しているコントロールのクライアント座標に変換してから、結果を表示しています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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);
}
  • 履歴:
  • 2014/9/29 全面的な書き直し。

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。