프로젝트

c# chart 마우스휠 확대 축소 (2) - chartarea가 여러 개 있을 때

BLDC 2020. 2. 10. 23:13



        protected void chart1_MouseWheel(object sender, MouseEventArgs e)
        {
            double y, yMin, yMax, yMin2, yMax2;

            Charting.ChartArea ca;


            Charting.HitTestResult result = chart1.HitTest(e.X, e.Y);

// HitTestResult 객체 멤버는 마우스휠 이벤트가 발생한 ChartArea 정보를 갖고 있다.


            if (result.ChartArea != null)
            {
                ca = result.ChartArea;
                var yAxis = ca.AxisY;
                yMin = yAxis.ScaleView.ViewMinimum;
                yMax = yAxis.ScaleView.ViewMaximum;
                y = yAxis.PixelPositionToValue(e.Location.Y);

                if (e.Delta < 0) // Scrolled down.
                {
                    yMin2 = y - (y - yMin) / 0.9;
                    yMax2 = y + (yMax - y) / 0.9;
                }
                else //if (e.Delta > 0) // Scrolled up.
                {
                    yMin2 = y - (y - yMin) * 0.9;
                    yMax2 = y + (yMax - y) * 0.9;
                }

                if (yMax2 > 3.3) yMax2 = 3.3;
                if (yMin2 < 0) yMin2 = 0;

                ca.AxisY.Maximum = yMax2;
                ca.AxisY.Minimum = yMin2;


// 아래 코드는 확대/축소 했을 때, y-축 값이 소수점 아래 한자리 또는 두자리로 떨어지도록

// y-축 값의 범위에 따라 y-축 라벨의 interval을 지정

                double dy = yMax2 - yMin2;
                if (dy < 0.05) ca.AxisY.Interval = 0.01;
                else if (dy < 0.1) ca.AxisY.Interval = 0.02;
                else if (dy < 0.2) ca.AxisY.Interval = 0.05;
                else if (dy < 0.65) ca.AxisY.Interval = 0.1;
                else if (dy < 1.25) ca.AxisY.Interval = 0.2;
                else if (dy < 1.75) ca.AxisY.Interval = 0.25;
                else ca.AxisY.Interval = 0.5;
                ca.AxisY.IntervalOffset = ((int)(ca.AxisY.Minimum / ca.AxisY.Interval)) * ca.AxisY.Interval
                    - ca.AxisY.Minimum;
            }
        }