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 に答える