Chart
您可以通过依赖MouseMove
事件(如 gunr2171 所建议的)和ChartArea
通过依赖其Position
属性(MSDN 链接)给出的来定位鼠标的位置。为了提供您所追求的定位类型,需要解决各种问题(X 从左到右,Y 从下到上;相对于 ChartArea 给出的框架):
- 更正 Y 值,该值将“反向”提供(从顶部 (0) 到底部(高度))。
- 确定给定的坐标(参考图表)是否在给定的 ChartArea 内。
- 将坐标从 Chart 参考系统转换为 ChartArea 参考系统。
首先是计算最大值/最小值。定义给定 ChartArea 的值:
int minX1, minY1, maxX1, maxY1;
minX1 = (int)chart1.ChartAreas[0].Position.X;
maxX1 = (int)(chart1.ChartAreas[0].Position.X + chart1.ChartAreas[0].Position.Width * chart1.Width /100);
minY1 = (int)chart1.ChartAreas[0].Position.Y;
maxY1 = (int)(chart1.ChartAreas[0].Position.Y + chart1.ChartAreas[0].Position.Height * chart1.Height/100);
在给定图表的 MouseMove 事件中:
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
Point posChart = new Point(e.X, e.Y); //Position of the mouse respect to the chart
if (posChart.X >= minX1 && posChart.X <= maxX1 && posChart.Y >= minY1 && posChart.Y <= maxY1)
{
//The mouse is inside the given area
//Conversion of the mouse position to the ChartArea reference system, with the corresponding "inversion" of the Y values
Point posChartArea = new Point(posChart.X - minX1, Math.Abs((posChart.Y - minY1) - maxY1));
}
}
注意:Hans Passant 提供了一个有趣的链接来确定鼠标是否在某个 ChartArea 内。它可能会取代chart1_MouseMove
方法上的条件,尽管不是在不同参考系统(图表和 ChartArea 系统)之间移动所需的最小/最大值、X/Y 计算。在任何情况下,您都必须确保此函数所期望的确切输入(在提供的链接中没有明确解释),记住涉及 3 个不同的参考系统(全局系统、图表系统和ChartArea 之一)。在这种情况下,我更喜欢“手动”执行整个计算,以避免在使用不同的参考系统时出现兼容性问题。