gpt4 book ai didi

c# - 检测鼠标是否在 ChartArea 内

转载 作者:行者123 更新时间:2023-12-05 05:27:36 24 4
gpt4 key购买 nike

我有一个图表表单,其中有一个图表,但有三个 ChartAreas。此外,每个 ChartArea 都可以是可见的,也可以是不可见的,目的是至少有一个是可见的。用户还可以调整表格的大小,从而导致调整整个图表的大小,但幸运的是没有重新定位;但是,由于调整大小,最大 XY 范围可能会有所不同。

我希望能够根据鼠标操作对每个 ChartArea 执行缩放/取消缩放操作。例如;将鼠标悬停在给定的 ChartArea 上并使用鼠标滚轮我想缩放/取消缩放。

我不确定如何确定 ChartArea 的地理位置。例如,我有一个图表,3 个 ChartAreas,那么它们之间的间隔是否相等?我如何确定图表之间的缓冲区间距,甚至是一个属性?关于我是否在物理图表空间中的相同问题;这些是 FastLine 图表,所以我有 X 轴和 Y 轴,并且这些都标有标签。此外,数据值可能导致 X 轴标记更大 - 从而使该轴更向右移动。

我是否使用 Axis(XY).PixelPositionToValue,如果该值 <0 那么我不在 ChartArea 中?

最佳答案

您可以根据 MouseMove 事件(如 gunr2171 所建议的那样)和给定的 ChartArea 定位鼠标在 Chart 上的位置> 依靠其 Position 属性 (MSDN link)。为了提供您所追求的那种定位(X 从左到右,Y 从下到上;相对于 ChartArea 给出的框架),需要解决各种问题:

  • 更正 Y 值,该值将“反向”提供(从顶部 (0)到底部(高度))。
  • 判断给定的坐标(指图表)是否在给定的图表区域内。
  • 将坐标从 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 提供了一个 interesting link 来确定鼠标是否在某个 ChartArea 内。它可能会替换 chart1_MouseMove 方法上的条件,尽管无论如何都不是在不同引用系统(Chart 和 ChartArea 的引用系统)之间移动所需的最小/最大、X/Y 计算。在任何情况下,您都必须通过牢记涉及 3 个不同的引用系统(全局引用系统、图表和ChartArea 之一)。在这种情况下,我更喜欢“手动”执行整个计算,以避免在使用不同引用系统时出现兼容性问题。

关于c# - 检测鼠标是否在 ChartArea 内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18623189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com