如何获取 ContextMenuStrip 的位置?

Posted

技术标签:

【中文标题】如何获取 ContextMenuStrip 的位置?【英文标题】:How to get the location of ContextMenuStrip? 【发布时间】:2017-06-29 21:59:14 【问题描述】:

我已将 ContextMenuStrip 附加到 Chart 控件。

如何获取 ContextMenuStrip 出现时左上角所在的图表控件坐标?

这是我要转换为图表坐标的点:

【问题讨论】:

很不清楚你的意思或它为什么重要。使用控件的 PointToClient() 方法映射到图表控件的坐标。或者也许 Axis.PixelPositionToValue() 映射到图表轴。不要让我们猜测。 我希望能够在我点击的地方插入一个标记。 PointToClient 解决了它:-) 我想 :-( 【参考方案1】:

在ContextMenuStrip的Opening事件中使用答案查询当前鼠标光标位置,会在打开strip有点延迟时传递错误的位置。

如果你需要真正点击的位置,从控件的属性中移除 ContextMenuStrip 并在控件的 MouseDown 事件中手动打开上下文菜单。在那里您可以访问实际的点击位置。

private void panel1_MouseDown(object sender, MouseEventArgs e)

    if(e.Button == MouseButtons.Right)
    
        var relativeClickedPosition = e.Location;
        var screenClickedPosition = (sender as Control).PointToScreen(relativeClickedPosition);
        contextMenuStrip1.Show(screenClickedPosition);
    

relativeClickedPosition 是光标相对于控件的位置。

【讨论】:

【参考方案2】:

我向 ContextMenuStrip 添加了一个 ContextMenuStrip_Opening 事件。在那里我可以保存菜单弹出位置。

我做了这样的事情:

menuPopupLocation = chart.PointToClient(System.Windows.Forms.Cursor.Position);

那么我可以使用:

double dataX = chart.ChartAreas[0].AxisX.PixelPositionToValue(menuPopupLocation.X);
double dataY = chart.ChartAreas[0].AxisX.PixelPositionToValue(menuPopupLocation.Y);

【讨论】:

以上是关于如何获取 ContextMenuStrip 的位置?的主要内容,如果未能解决你的问题,请参考以下文章

C#Winform中如何获取contextMenuStrip弹出的父控件的相关信息

c#contextmenustrip使用问题

contextmenustrip 通过二级菜单的点击 怎么获取当前关联控件,是二级菜单,不是一级菜单。

C# 窗体控件ContextMenuStrip下拉项之间的分割线

如何将自定义动画添加到 ContextMenuStrip?

C#界面里的winform ContextMenuStrip属性