1

我试图在 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。我希望这只是某个地方的一个简单的错字。
提前致谢!

4

1 回答 1

0

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

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 { }            
    }

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

于 2012-12-12T19:59:49.170 回答