1.引入Chart控件,如图

winform中chart鼠标滚轮缩放X Y轴,绘制ROI兴趣区_winform


添加一个XY 选择的复选框,给chart添加chart_MouseMove,chart_MouseDown,chart_MouseUp事件


事件代码如下,对象命名随意请忽视

public double chartBeforePointX = 0; // 用于记录鼠标上次移动的点,用于判断是左移还是右移
    public double chartBeforePointY = 0; // 用于记录鼠标上次移动的点,用于判断是左移还是右移
    public bool chartFlag;
    int X1 = 0;
    private void chartNuclide_MouseDown(object sender, MouseEventArgs e)
    {
        //var hitTestResult = this.chartNuclide.HitTest(e.X, e.Y);

        A2 = true;
        X = (int)cursor1;

        chartBeforePointX = 0;
        chartBeforePointY = 0;
        chartFlag = true;

        Z = chartNuclide.ChartAreas[0].CursorX.Position;
        //chartNuclide.ChartAreas[0].CursorX
        try
        {
            cursorX = chartNuclide.ChartAreas[0].AxisX.PixelPositionToValue(e.X);

            //double daozhi = 0;

            //daozhi = ((double)cursorX / CFN);

            if (cursorX > 0)
            {
                label36.Text = cursorX.ToString("0.00");
                label35.Text = ((int)originalData1[(int)(cursorX/ CFN)] < 0 ? 0 : (int)originalData1[(int)(cursorX / CFN)]).ToString();
            }
        }
        catch (Exception)
        {

        }
    }

    private void chartNuclide_MouseUp(object sender, MouseEventArgs e)
    {
        chartFlag = false;

    }

    bool A2 = false;

    private void chartNuclide_SelectionRangeChanged(object sender, CursorEventArgs e)
    {
        try
        {
            if (A2)
            {
                Y = cursor1;
                A2 = false;
                double end = 0;
                double start = 0;
                if (X > Y)
                {
                    end = Y;
                    start = X;
                }
                else
                {
                    start = Y;
                    end = X;
                }

                rOIS2 = new ROI()
                {
                    point1 = end,
                    point2 = start
                };

                double db1 = ZuoBiaoOriginal.Max<double>(sp => sp);

                this.chartNuclide.ChartAreas[0].AxisY.Minimum = 0;
                this.chartNuclide.ChartAreas[0].AxisY.Maximum = db1 + (db1 * 0.3) + 1;
                this.chartNuclide.Series[0].Points.Clear();
                for (int i = 0; i < ZuoBiaoOriginal.Length; i++)
                {
                    this.chartNuclide.Series[0].Points.AddXY(i + 1, ZuoBiaoOriginal[i]);

                    if (i >= end && i <= start && chartNuclide.Series[0].Points[i].YValues[0] > 0)
                    {
                        chartNuclide.Series[0].Points[i].Color = Color.Aqua;
                    }

                    for (int s = 0; s < rOIS1.Count; s++)
                    {

                        if (rOIS1[s] != null && i >= rOIS1[s].point1 && i <= rOIS1[s].point2)
                        {
                            chartNuclide.Series[0].Points[i].Color = Color.Red;
                        }
                    }
                }
            }
        }
        catch (Exception)
        {
        }
    }

    private void chartNuclide_MouseMove(object sender, MouseEventArgs e)
    {
        try
        {
            double cursorX = chartNuclide.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
            double cursorY = chartNuclide.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
            cursor1 = (int)cursorX;

            if (chartFlag)
            {
                //e.x代表的是当前点

                double CW12 = ZuoBiaoOriginal.Max<double>(sp => sp) * 1.3;

                if (ckx.Checked)
                {
                    double x = (double)((chartNuclide.ChartAreas[0].AxisX.ScaleView.ViewMaximum - chartNuclide.ChartAreas[0].AxisX.ScaleView.ViewMinimum) * 0.03);

                    if (chartBeforePointX != 0 && e.X - chartBeforePointX > 0)//往右移动了
                    {
                        if (chartNuclide.ChartAreas[0].AxisX.ScaleView.Position > x)
                        {
                            chartNuclide.ChartAreas[0].AxisX.ScaleView.Position -= x;

                        }
                        else
                        {
                            chartNuclide.ChartAreas[0].AxisX.ScaleView.Position -= chartNuclide.ChartAreas[0].AxisX.ScaleView.Position;

                        }
                    }
                    else if (chartBeforePointX != 0 && e.X - chartBeforePointX < 0)//往左移动了
                    {
                        if (chartNuclide.ChartAreas[0].AxisX.ScaleView.ViewMaximum < (int)Size)
                        {
                            if ((int)Size - chartNuclide.ChartAreas[0].AxisX.ScaleView.ViewMaximum < x)
                            {
                                chartNuclide.ChartAreas[0].AxisX.ScaleView.Position += (int)Size - (int)chartNuclide.ChartAreas[0].AxisX.ScaleView.ViewMaximum;
                            }
                            else
                            {
                                chartNuclide.ChartAreas[0].AxisX.ScaleView.Position += x;
                            }
                        }
                    }
                    chartNuclide.ChartAreas[0].AxisX.ScaleView.Position = (int)chartNuclide.ChartAreas[0].AxisX.ScaleView.Position;

                    chartBeforePointX = e.X;

                }
                if (cky.Checked)
                {
                    double y = (double)((chartNuclide.ChartAreas[0].AxisY.ScaleView.ViewMaximum - chartNuclide.ChartAreas[0].AxisY.ScaleView.ViewMinimum) * 0.03);
                    if (chartBeforePointY != 0 && e.Y - chartBeforePointY > 0)//往上移动了
                    {
                        if (chartNuclide.ChartAreas[0].AxisY.ScaleView.ViewMaximum >= CW12)
                        {
                            return;
                        }
                        else
                        {
                            chartNuclide.ChartAreas[0].AxisY.ScaleView.Position += y;
                        }
                    }
                    else if (chartBeforePointY != 0 && e.Y - chartBeforePointY < 0)//往下移动了
                    {
                        if (chartNuclide.ChartAreas[0].AxisY.ScaleView.Position > y)
                        {
                            chartNuclide.ChartAreas[0].AxisY.ScaleView.Position -= y;
                        }
                        else
                        {
                            chartNuclide.ChartAreas[0].AxisY.ScaleView.Position -= chartNuclide.ChartAreas[0].AxisY.ScaleView.Position;
                        }
                    }
                    chartBeforePointY = e.Y;
                    chartNuclide.ChartAreas[0].AxisY.ScaleView.Position = (int)chartNuclide.ChartAreas[0].AxisY.ScaleView.Position;
                }
            }
        }
        catch (Exception)
        {
        }
    }


然后就可以进行缩放了 看下图的X轴

winform中chart鼠标滚轮缩放X Y轴,绘制ROI兴趣区_上位机_02

winform中chart鼠标滚轮缩放X Y轴,绘制ROI兴趣区_C#_03

曲线ROI兴趣区绘制见下篇文章,暂时还没写。