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

我已将 ContextMenuStrip 附加到 Chart 控件。

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

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

【问题讨论】:

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

标签: c# windows visual-studio


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多