【问题标题】:Getting cursor location within chart during mousewheel event在鼠标滚轮事件期间获取图表中的光标位置
【发布时间】:2012-12-09 22:41:32
【问题描述】:

我试图在 MouseWheel 事件期间获取鼠标的位置。在 MouseMove 事件中,我已成功使用 HitTest 并以这种方式开展业务,但由于某种原因,在 MouseWheel 事件期间,我的 HitTest 始终为 HitTest 数据点返回值 -1。谁能帮我解决这个问题?我将在下面包含我的代码。
我想要完成的是一个带有鼠标滚轮的基本放大事件。我想查看光标的位置,然后在任一侧添加当前可查看图表的 1/4。

    private void chData_MouseWheel(object sender, MouseEventArgs e)
    {
        try
        {
            HitTestResult pos = chData.HitTest(e.X, e.Y);

            if (e.Delta < 0)
            {
                chData.ChartAreas[0].AxisX.ScaleView.ZoomReset();
                chData.ChartAreas[0].AxisY.ScaleView.ZoomReset();
            }
            if (e.Delta > 0)
            {
                double xMin = chData.ChartAreas[0].AxisX.ScaleView.ViewMinimum;
                double xMax = chData.ChartAreas[0].AxisX.ScaleView.ViewMaximum;
                double yMin = chData.ChartAreas[0].AxisY.ScaleView.ViewMinimum;
                double yMax = chData.ChartAreas[0].AxisY.ScaleView.ViewMaximum;

                double posXStart = pos.PointIndex - (xMax - xMin) / 4;
                double posXFinish = pos.PointIndex + (xMax - xMin) / 4;
                double posYStart = pos.PointIndex - (yMax - yMin) / 4;
                double posYFinish = pos.PointIndex + (yMax - yMin) / 4;

                chData.ChartAreas[0].AxisX.ScaleView.Zoom(posXStart, posXFinish);
                chData.ChartAreas[0].AxisY.ScaleView.Zoom(posYStart, posYFinish);
            }
        }
        catch { }

    }

顺便说一下,我的图表叫做 chData。我希望这只是某个地方的一个简单的错字。
提前致谢!

【问题讨论】:

  • 所以我发现 PointIndex 仅在您实际位于数据点上时才有效。我需要知道我在哪个 x 轴值,即使我没有超过一个数据点。有人有什么想法吗?

标签: c# charts mousewheel


【解决方案1】:

好的,经过几天的实验,我终于找到了可行的方法。
我将包含我的整个代码,因为我知道我无法在任何地方找到此解决方案,因此我希望这可能对其他人有所帮助。

private void chData_MouseWheel(object sender, MouseEventArgs e)
    {
        try
        {
            if (e.Delta < 0)
            {
                chData.ChartAreas[0].AxisX.ScaleView.ZoomReset();
                chData.ChartAreas[0].AxisY.ScaleView.ZoomReset();
            }

            if (e.Delta > 0)
            {
                double xMin = chData.ChartAreas[0].AxisX.ScaleView.ViewMinimum;
                double xMax = chData.ChartAreas[0].AxisX.ScaleView.ViewMaximum;
                double yMin = chData.ChartAreas[0].AxisY.ScaleView.ViewMinimum;
                double yMax = chData.ChartAreas[0].AxisY.ScaleView.ViewMaximum;

                double posXStart = chData.ChartAreas[0].AxisX.PixelPositionToValue(e.Location.X) - (xMax - xMin) / 4;
                double posXFinish = chData.ChartAreas[0].AxisX.PixelPositionToValue(e.Location.X) + (xMax - xMin) / 4;
                double posYStart = chData.ChartAreas[0].AxisY.PixelPositionToValue(e.Location.Y) - (yMax - yMin) / 4;
                double posYFinish = chData.ChartAreas[0].AxisY.PixelPositionToValue(e.Location.Y) + (yMax - yMin) / 4;

                chData.ChartAreas[0].AxisX.ScaleView.Zoom(posXStart, posXFinish);
                chData.ChartAreas[0].AxisY.ScaleView.Zoom(posYStart, posYFinish);
            }
        }
        catch { }            
    }

所以这段代码基本上所做的就是放大你光标所在的图表。它本质上会将轴最大/最小值限制为您当前查看的值的一半,但以光标为中心。
我知道可能有一些方法可以优化这一点,但目前我认为这足以让人们开始。
我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多