C# 利用MSChart实现波形分析

来源:互联网 发布:图形界面网络配置 编辑:程序博客网 时间:2024/05/17 08:41
 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using WaveAnalysisToolCS.SQLConn;

namespace WaveAnalysisToolCS
{
    public partial class WaveFreqChart : Form
    {
        private float[] VibDataBuf = null;
        private int FreqPageIndex = 1;      //频谱缩放后的第几页显示
        private int FreqPageOffSet1 = 0;    //频谱缩放后的第几页显示的开始偏移量
        private int FreqPageOffSet2 = 0;    //频谱缩放后的第几页显示的结束偏移量
        private int WavePageIndex = 1;      //波形缩放后的第几页显示
        private int WavePageOffSet1 = 0;    //波形缩放后的第几页显示的开始偏移量
        private int WavePageOffSet2 = 0;    //波形缩放后的第几页显示的结束偏移量


        public WaveFreqChart(float[] vibbuf)
        {
            InitializeComponent();
            VibDataBuf = vibbuf;
        }

 

        private void WaveFreqChart_Load(object sender, EventArgs e)
        {
            DrawChartWave();
            //DrawChartFreq();//radBtnHanning_Click会被触发,此处注视掉
            textBoxWaveNum.Text = VibDataBuf.Length.ToString();
            textboxFreqNum.Text = Const.GetAmpSpecLen(VibDataBuf.Length).ToString();
            comBoxFreq.SelectedIndex = 0;
            comBoxWave.SelectedIndex = 0;
        }


        //矩形框,汉宁框的处理
        private void radBtnHanning_Click(object sender, EventArgs e)
        {
            DrawChartFreq();
        }


        //频谱图放大倍数的处理
        private void comBoxFreq_SelectedIndexChanged(object sender, EventArgs e)
        {
            int freqGain = comBoxFreq.SelectedIndex + 1;
            int totalPage = Const.GetPageNumByGain(freqGain);
            if (FreqPageIndex > totalPage)
                FreqPageIndex = totalPage;
            DrawChartFreq();
            EnableFreqButtonControl(totalPage);
        }

        //波形图放大倍数的处理
        private void comBoxWave_SelectedIndexChanged(object sender, EventArgs e)
        {
            int waveGain = comBoxWave.SelectedIndex + 1;
            int totalPage = Const.GetPageNumByGain(waveGain);
            if (WavePageIndex > totalPage)
                WavePageIndex = totalPage;
            DrawChartWave();
            EnableWaveButtonControl(totalPage);
        }


        //显示频谱数据的上一页
        private void btnFreqLeft_Click(object sender, EventArgs e)
        {
            int freqGain = comBoxFreq.SelectedIndex + 1;
            int totalPage = Const.GetPageNumByGain(freqGain);
            FreqPageIndex--;
            if (FreqPageIndex <= 0)
            {
                FreqPageIndex = 1;
            }
            else
            {
                DrawChartFreq();
            }
            EnableFreqButtonControl(totalPage);
        }

 

        //显示频谱数据的下一页
        private void btnFreqRight_Click(object sender, EventArgs e)
        {
            int freqGain = comBoxFreq.SelectedIndex + 1;
            int totalPage = Const.GetPageNumByGain(freqGain);
            FreqPageIndex++;
            if (FreqPageIndex > totalPage)
            {
                FreqPageIndex = totalPage;
            }
            else
            {
                DrawChartFreq();
            }
            EnableFreqButtonControl(totalPage);
        }

 

        //显示波形数据的上一页
        private void btnWaveLeft_Click(object sender, EventArgs e)
        {
            int waveGain = comBoxWave.SelectedIndex + 1;
            int totalPage = Const.GetPageNumByGain(waveGain);
            WavePageIndex--;
            if (WavePageIndex <= 0)
            {
                WavePageIndex = 1;
            }
            else
            {
                DrawChartWave();
            }
            EnableWaveButtonControl(totalPage);
        }


        //显示波形数据的下一页
        private void btnWaveRight_Click(object sender, EventArgs e)
        {
            int waveGain = comBoxWave.SelectedIndex + 1;
            int totalPage = Const.GetPageNumByGain(waveGain);
            WavePageIndex++;
            if (WavePageIndex > totalPage)
            {
                WavePageIndex = totalPage;
            }
            else
            {
                DrawChartWave();
            }
            EnableWaveButtonControl(totalPage);
        }


        //使Freq数据的左右移动的button控件有效
        private void EnableFreqButtonControl(int totalNum)
        {
            textBoxFreqPage.Text = FreqPageIndex + "/" + totalNum;
            if (totalNum > 1)
            {
                btnFreqLeft.Enabled = true;
                btnFreqRight.Enabled = true;
                if (FreqPageIndex == 1)
                {
                    btnFreqLeft.Enabled = false;
                }
                else if (FreqPageIndex == totalNum)
                {
                    btnFreqRight.Enabled = false;
                }
            }
            else
            {
                btnFreqLeft.Enabled = false;
                btnFreqRight.Enabled = false;
            }

            checkBoxGainFreq.Enabled = true;
        }


        //使Wave数据的左右移动的button控件有效
        private void EnableWaveButtonControl(int totalNum)
        {
            textBoxWavePage.Text = WavePageIndex + "/" + totalNum;
            if (totalNum > 1)
            {
                btnWaveLeft.Enabled = true;
                btnWaveRight.Enabled = true;
                if (WavePageIndex == 1)
                {
                    btnWaveLeft.Enabled = false;
                }
                else if (WavePageIndex == totalNum)
                {
                    btnWaveRight.Enabled = false;
                }
            }
            else
            {
                btnWaveLeft.Enabled = false;
                btnWaveRight.Enabled = false;
            }
        }


        //显示频谱数据的坐标值
        private void checkBoxFreqValue_CheckedChanged(object sender, EventArgs e)
        {
            DrawChartFreq();
        }

        private void checkBoxWaveValue_CheckedChanged(object sender, EventArgs e)
        {
            DrawChartWave();
        }


        #region 频谱区域的绘画操作
        private DataPoint FreqDataPointFirst = null;    //频谱测距开始的第一个点
        private DataPoint FreqDataPointSecond = null;   //频谱测距开始的第二个点
        private Boolean IsBeginDrawFreqZoomRect = false;//频谱开始拖动缩放标志
        private Boolean IsBeginDrawFreqDiffLine = false;//频谱开始测距标志
        private Point FreqPointDiffStart = new Point(); //频谱测距开始的点
        private Point FreqPointDiffEnd = new Point();   //频谱测距结束的点
        private Point FreqPointZoomStart = new Point(); //频谱开始缩放的第一个点
        private Point FreqPointMoving = new Point();    //频谱移动中的点


        private void ClearFreqAllStatus()
        {
            foreach (DataPoint point in ChartFreq.Series[0].Points)
            {
                DataPoint pt = point;
                ReleaseDataPoint(ref pt);
            }
            listViewFreq.Items.Clear();

            //停止重绘缩放拖动的线
            IsBeginDrawFreqZoomRect = false;
            FreqPointZoomStart.X = 0;
            FreqPointZoomStart.Y = 0;
            FreqPointMoving.X = 0;
            FreqPointMoving.Y = 0;

            //停止重绘测差的线
            IsBeginDrawFreqDiffLine = false;
            FreqPointDiffStart.X = 0;
            FreqPointDiffStart.Y = 0;
            FreqPointDiffEnd.X = 0;
            FreqPointDiffEnd.Y = 0;

            FreqDataPointFirst = null;
            FreqDataPointSecond = null;
            FreqPageOffSet1 = 0;
            FreqPageOffSet1 = 0;
        }


        private void HandleFreqGainFunc(int curPointIndex)
        {
            int start = Const.GetChartPageStartIndex(VibDataBuf, Const.ChartType.ChartFreq, comBoxFreq.SelectedIndex + 1, FreqPageIndex);
            int count = Const.GetChartOnePageCount(VibDataBuf, Const.ChartType.ChartFreq, comBoxFreq.SelectedIndex + 1);

            //清除上一次的频谱放大功能
            for (int j = 0; j < count; j++)
            {
                DataPoint dPoint = ChartFreq.Series[0].Points[j];
                ReleaseDataPoint(ref dPoint);
            }

            listViewFreq.Items.Clear();
            count += (start - 1);
            int i = 1;
            int index = (start + curPointIndex) * i;

            while (index < count)
            {
                DataPoint dPoint = ChartFreq.Series[0].Points[index - start];
                GainFreqDataPoint(ref dPoint);

                //数据填充到listview
                ListViewItem lvi = new ListViewItem();
                lvi.Text = i.ToString() + "倍频";
                lvi.SubItems.Add((index * Const.LINETOFREQ).ToString());
                lvi.SubItems.Add(dPoint.YValues[0].ToString("f4"));
                lvi.Font = new Font("宋体", 10, FontStyle.Bold);
                listViewFreq.Items.Add(lvi);

                i++;
                index = (start + curPointIndex) * i;
            }
            this.Cursor = Cursors.Default;           
        }

 


        //ChartFreq 鼠标按下事件处理
        private void ChartFreq_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)//右键清除所有的状态
            {
                ClearFreqAllStatus();
                return;
            }

            HitTestResult hitResult = ChartFreq.HitTest(e.X, e.Y);
            if (hitResult == null)
            {
                return;
            }

            if (hitResult.ChartElementType == ChartElementType.DataPoint && false == IsGainFreqEnable())//进入测差功能
            {
                if (FreqDataPointSecond != null)
                {
                    ReleaseDataPoint(ref FreqDataPointFirst);
                    ReleaseDataPoint(ref FreqDataPointSecond);
                }
                if (FreqDataPointFirst == null)//测距的第一个点被按下
                {
                    FreqDataPointFirst = (DataPoint)hitResult.Object;
                    PressDataPoint(ref FreqDataPointFirst);
                    InsertFreqListItem(ref FreqDataPointFirst, hitResult.PointIndex);
                    FreqPointDiffStart.X = e.X;
                    FreqPointDiffStart.Y = e.Y;
                    IsBeginDrawFreqDiffLine = true;
                }
                else//测距的第二个点被按下
                {
                    FreqDataPointSecond = (DataPoint)hitResult.Object;
                    PressDataPoint(ref FreqDataPointSecond);
                    InsertFreqListItem(ref FreqDataPointSecond, hitResult.PointIndex);
                    FreqPointDiffEnd.X = e.X;
                    FreqPointDiffEnd.Y = e.Y;
                }
                FreqPointMoving.X = e.X;
                FreqPointMoving.Y = e.Y;
            }
            else if (hitResult.ChartElementType == ChartElementType.DataPoint && IsGainFreqEnable())//进入倍频功能
            {
                HandleFreqGainFunc(hitResult.PointIndex);
            }
            else//鼠标放大Enable
            {
                IsBeginDrawFreqZoomRect = true;
                FreqPointZoomStart.X = e.X;
                FreqPointZoomStart.Y = e.Y;
            }
        }


        //ChartFreq 鼠标移动事件处理
        private void ChartFreq_MouseMove(object sender, MouseEventArgs e)
        {
            HitTestResult result = ChartFreq.HitTest(e.X, e.Y);
            if (result == null)
            {       
                return;
            }

 

            if (result.ChartElementType == ChartElementType.DataPoint)//当光标停在数据点上时会改变点的样子
            {
                this.Cursor = Cursors.Cross;
                DataPoint dPoint = ChartFreq.Series[0].Points[result.PointIndex];
                if (dPoint == FreqDataPointFirst || dPoint == FreqDataPointSecond || dPoint.MarkerStyle == MarkerStyle.Triangle)
                    return;
                CursorDataPoint(ref dPoint);
            }
            else
            {

                foreach (DataPoint point in ChartFreq.Series[0].Points)
                {
                    DataPoint pt = point;
                    if (pt == FreqDataPointFirst || pt == FreqDataPointSecond || pt.MarkerStyle == MarkerStyle.Triangle)
                        continue;
                    ReleaseDataPoint(ref pt);
                }
                this.Cursor = Cursors.Default;
            }

            if (IsBeginDrawFreqZoomRect || IsBeginDrawFreqDiffLine)
            {
                FreqPointMoving.X = e.X;
                FreqPointMoving.Y = e.Y;
                ChartFreq.Invalidate();
            }
        }


        //ChartFreq 鼠标抬起事件处理
        private void ChartFreq_MouseUp(object sender, MouseEventArgs e)
        {
            HitTestResult hitResult = ChartFreq.HitTest(e.X, e.Y);
            if (hitResult == null)
            {
                return;
            }

            if (IsBeginDrawFreqZoomRect == true && FreqPointZoomStart != e.Location)//放大所选的矩形区域
            {
                int zoomStartIndex = -1;
                int zoomEndIndex = -1;

                if (true == GetZoomStartEndInRect(ChartFreq,FreqPointZoomStart, e.Location, ref zoomStartIndex, ref zoomEndIndex))
                {
                    //根据zoomStartIndex,zoomEndIndex 缩放选中的区域
                    FreqPageOffSet1 = zoomStartIndex;
                    FreqPageOffSet2 = zoomEndIndex;
                    DrawChartFreq();
                    FreqPageOffSet1 = 0;
                    FreqPageOffSet2 = 0;
                    checkBoxGainFreq.Enabled = false;
                }
            }
            IsBeginDrawFreqZoomRect = false;
            FreqPointZoomStart.X = 0;
            FreqPointZoomStart.Y = 0;
        }


        //画频谱图
        private void DrawChartFreq()
        {
            ClearFreqAllStatus();
            int window = 0;
            if (radBtnHanning.Checked)
                window = 1;

            DataTable DTFreqData = Const.GetFreqDataTableByFloatArray(VibDataBuf, comBoxFreq.SelectedIndex + 1, FreqPageIndex, window, FreqPageOffSet1, FreqPageOffSet2);
            if (DTFreqData != null)
            {
                ChartFreq.DataSource = DTFreqData;
                ChartFreq.Series[0].XValueMember = "FreqX";
                ChartFreq.Series[0].YValueMembers = "FreqY";
                ChartFreq.DataBind();
                if (checkBoxFreqValue.Checked)
                {
                    ChartFreq.Series[0].IsValueShownAsLabel = true;
                }
                else
                {
                    ChartFreq.Series[0].IsValueShownAsLabel = false;
                }
            }
        }


        //ChartFreq的绘图处理
        private void ChartFreq_PrePaint(object sender, ChartPaintEventArgs e)
        {
            if (IsBeginDrawFreqZoomRect)
            {
                Pen grayPen = new Pen(Color.Gray, 1);
                e.ChartGraphics.Graphics.DrawRectangle(grayPen, new Rectangle(FreqPointZoomStart.X, FreqPointZoomStart.Y, FreqPointMoving.X - FreqPointZoomStart.X, FreqPointMoving.Y - FreqPointZoomStart.Y));
                grayPen.Dispose();
            }
            else if (IsBeginDrawFreqDiffLine)
            {
                Pen redPen = new Pen(Color.Red, 1);
                if (FreqDataPointSecond == null)
                    e.ChartGraphics.Graphics.DrawLine(redPen, FreqPointDiffStart.X, FreqPointDiffStart.Y, FreqPointMoving.X, FreqPointMoving.Y);
                else
                    e.ChartGraphics.Graphics.DrawLine(redPen, FreqPointDiffStart.X, FreqPointDiffStart.Y, FreqPointDiffEnd.X, FreqPointDiffEnd.Y);
                redPen.Dispose();
            }
        }


        //向Freq ListView中插入计算的频谱结果
        private void InsertFreqListItem(ref DataPoint dPoint,int index)
        {
            int start = Const.GetChartPageStartIndex(VibDataBuf, Const.ChartType.ChartFreq, comBoxFreq.SelectedIndex + 1, FreqPageIndex);

            if (dPoint == FreqDataPointFirst)
            {
                listViewFreq.Items.Clear();
                ListViewItem lvi = new ListViewItem();
                lvi.Text = "起始点";
                lvi.SubItems.Add(((start + index) * Const.LINETOFREQ).ToString());
                lvi.SubItems.Add(dPoint.YValues[0].ToString("f4"));
                lvi.Font = new Font("宋体", 10, FontStyle.Bold);
                listViewFreq.Items.Add(lvi);
            }
            else
            {
                ListViewItem lvi = new ListViewItem();
                lvi.Text = "结束点";
                lvi.SubItems.Add(((start + index) * Const.LINETOFREQ).ToString());
                lvi.SubItems.Add(dPoint.YValues[0].ToString("f4"));
                lvi.Font = new Font("宋体", 10, FontStyle.Bold);
                listViewFreq.Items.Add(lvi);

                lvi = new ListViewItem();
                lvi.Text = "差值";
                float lastV =  float.Parse(listViewFreq.Items[0].SubItems[1].Text);

                lvi.SubItems.Add(((start + index) * Const.LINETOFREQ - lastV).ToString());
                lvi.SubItems.Add((FreqDataPointFirst.YValues[0] - dPoint.YValues[0]).ToString("f4"));
                lvi.Font = new Font("宋体", 10, FontStyle.Bold);
                listViewFreq.Items.Add(lvi);
            }
        }

        //频谱倍频功能
        private void checkBoxGainFreq_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxGainFreq.Checked)
            {
                lblGainFreq.Visible = true;
            }
            else
            {
                lblGainFreq.Visible = false;
            }
        }


        //判断倍频功能是否有效
        private Boolean IsGainFreqEnable()
        {
            if (checkBoxGainFreq.Enabled == true && checkBoxGainFreq.Checked == true)
                return true;
            else
                return false;
        }

        #endregion//频谱区域的绘画操作


        #region //波形区域的绘画操作
        private DataPoint WaveDataPointFirst = null;    //频谱测距开始的第一个点
        private DataPoint WaveDataPointSecond = null;   //频谱测距开始的第二个点
        private Boolean IsBeginDrawWaveZoomRect = false;//频谱开始拖动缩放标志
        private Boolean IsBeginDrawWaveDiffLine = false;//频谱开始测距标志
        private Point WavePointDiffStart = new Point(); //频谱测距开始的点
        private Point WavePointDiffEnd = new Point();   //频谱测距结束的点
        private Point WavePointZoomStart = new Point(); //频谱开始缩放的第一个点
        private Point WavePointMoving = new Point();    //频谱移动中的点

        private void ClearWaveAllStatus()
        {
            foreach (DataPoint point in ChartWave.Series[0].Points)
            {
                DataPoint pt = point;
                ReleaseDataPoint(ref pt);
            }
            listViewWave.Items.Clear();

            //停止重绘缩放拖动的线
            IsBeginDrawWaveZoomRect = false;
            WavePointZoomStart.X = 0;
            WavePointZoomStart.Y = 0;
            WavePointMoving.X = 0;
            WavePointMoving.Y = 0;

            //停止重绘测差的线
            IsBeginDrawWaveDiffLine = false;
            WavePointDiffStart.X = 0;
            WavePointDiffStart.Y = 0;
            WavePointDiffEnd.X = 0;
            WavePointDiffEnd.Y = 0;
            WaveDataPointFirst = null;
            WaveDataPointSecond = null;

            WavePageOffSet1 = 0;
            WavePageOffSet1 = 0;
        }
        private void ChartWave_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)//右键清除所有的状态
            {
                ClearWaveAllStatus();
                return;
            }

            HitTestResult hitResult = ChartWave.HitTest(e.X, e.Y);
            if (hitResult == null)
            {
                return;
            }

            if (hitResult.ChartElementType == ChartElementType.DataPoint)//进入测差功能
            {
                if (WaveDataPointSecond != null)
                {
                    ReleaseDataPoint(ref WaveDataPointFirst);
                    ReleaseDataPoint(ref WaveDataPointSecond);
                }
                if (WaveDataPointFirst == null)//测距的第一个点被按下
                {
                    WaveDataPointFirst = (DataPoint)hitResult.Object;
                    PressDataPoint(ref WaveDataPointFirst);
                    InsertWaveListItem(ref WaveDataPointFirst, hitResult.PointIndex);
                    WavePointDiffStart.X = e.X;
                    WavePointDiffStart.Y = e.Y;
                    IsBeginDrawWaveDiffLine = true;
                }
                else//测距的第二个点被按下
                {
                    WaveDataPointSecond = (DataPoint)hitResult.Object;
                    PressDataPoint(ref WaveDataPointSecond);
                    InsertWaveListItem(ref WaveDataPointSecond, hitResult.PointIndex);
                    WavePointDiffEnd.X = e.X;
                    WavePointDiffEnd.Y = e.Y;
                }
                WavePointMoving.X = e.X;
                WavePointMoving.Y = e.Y;
            }
            else//鼠标放大Enable
            {
                IsBeginDrawWaveZoomRect = true;
                WavePointZoomStart.X = e.X;
                WavePointZoomStart.Y = e.Y;
            }
        }

        private void ChartWave_MouseMove(object sender, MouseEventArgs e)
        {
            HitTestResult result = ChartWave.HitTest(e.X, e.Y);
            if (result == null)
            {
                return;
            }

            if (result.ChartElementType == ChartElementType.DataPoint)//当光标停在数据点上时会改变点的样子
            {
                this.Cursor = Cursors.Cross;
                DataPoint dPoint = ChartWave.Series[0].Points[result.PointIndex];
                if (dPoint == WaveDataPointFirst || dPoint == WaveDataPointSecond)
                    return;
                CursorDataPoint(ref dPoint);
            }
            else//当光标没有停在数据点上时,恢复数据点原来的样子
            {
                foreach (DataPoint point in ChartWave.Series[0].Points)
                {
                    DataPoint pt = point;
                    if (pt == WaveDataPointFirst || pt == WaveDataPointSecond)
                        continue;
                    ReleaseDataPoint(ref pt);
                }
                this.Cursor = Cursors.Default;
            }

            if (IsBeginDrawWaveZoomRect || IsBeginDrawWaveDiffLine)
            {
                WavePointMoving.X = e.X;
                WavePointMoving.Y = e.Y;
                ChartWave.Invalidate();
            }
        }

        private void ChartWave_MouseUp(object sender, MouseEventArgs e)
        {
            HitTestResult hitResult = ChartWave.HitTest(e.X, e.Y);
            if (hitResult == null)
            {
                return;
            }

            if (IsBeginDrawWaveZoomRect == true && WavePointZoomStart != e.Location)//放大所选的矩形区域
            {
                int zoomStartIndex = -1;
                int zoomEndIndex = -1;

                if (true == GetZoomStartEndInRect(ChartWave, WavePointZoomStart, e.Location, ref zoomStartIndex, ref zoomEndIndex))
                {
                    //根据zoomStartIndex,zoomEndIndex 缩放选中的区域
                    WavePageOffSet1 = zoomStartIndex;
                    WavePageOffSet2 = zoomEndIndex;
                    DrawChartWave();
                    WavePageOffSet1 = 0;
                    WavePageOffSet2 = 0;

                }
            }
            IsBeginDrawWaveZoomRect = false;
            WavePointZoomStart.X = 0;
            WavePointZoomStart.Y = 0;
        }

        //画波形图
        private void DrawChartWave()
        {
            ClearWaveAllStatus();
            DataTable DTWaveDate = Const.GetWaveDataTableByFloatArray(VibDataBuf, comBoxWave.SelectedIndex + 1, WavePageIndex, WavePageOffSet1, WavePageOffSet2);

            if (DTWaveDate != null)
            {
                ChartWave.DataSource = DTWaveDate;
                ChartWave.Series[0].XValueMember = "WaveX";
                ChartWave.Series[0].YValueMembers = "WaveY";
                ChartWave.DataBind();
                if (checkBoxWaveValue.Checked)
                {
                    ChartWave.Series[0].IsValueShownAsLabel = true;
                }
                else
                {
                    ChartWave.Series[0].IsValueShownAsLabel = false;
                }
            }
        }

        private void ChartWave_PrePaint(object sender, ChartPaintEventArgs e)
        {
            if (IsBeginDrawWaveZoomRect)
            {
                Pen grayPen = new Pen(Color.Gray, 1);
                e.ChartGraphics.Graphics.DrawRectangle(grayPen, new Rectangle(WavePointZoomStart.X, WavePointZoomStart.Y, WavePointMoving.X - WavePointZoomStart.X, WavePointMoving.Y - WavePointZoomStart.Y));
                grayPen.Dispose();
            }
            else if (IsBeginDrawWaveDiffLine)
            {
                Pen redPen = new Pen(Color.Red, 1);
                if (WaveDataPointSecond == null)
                    e.ChartGraphics.Graphics.DrawLine(redPen, WavePointDiffStart.X, WavePointDiffStart.Y, WavePointMoving.X, WavePointMoving.Y);
                else
                    e.ChartGraphics.Graphics.DrawLine(redPen, WavePointDiffStart.X, WavePointDiffStart.Y, WavePointDiffEnd.X, WavePointDiffEnd.Y);
                redPen.Dispose();
            }
        }


        //向Wave ListView中插入计算的频谱结果
        private void InsertWaveListItem(ref DataPoint dPoint, int index)
        {
            int start = Const.GetChartPageStartIndex(VibDataBuf, Const.ChartType.ChartWave, comBoxWave.SelectedIndex + 1, WavePageIndex);

            if (dPoint == WaveDataPointFirst)
            {
                listViewWave.Items.Clear();
                ListViewItem lvi = new ListViewItem();
                lvi.Text = "起始点";
                float value = (start + index) * 1000 / Const.SAMPLEFREQ;
                lvi.SubItems.Add(value.ToString("f2"));
                lvi.SubItems.Add(dPoint.YValues[0].ToString("f4"));
                lvi.Font = new Font("宋体", 10, FontStyle.Bold);
                listViewWave.Items.Add(lvi);
            }
            else
            {
                ListViewItem lvi = new ListViewItem();
                lvi.Text = "结束点";
                float value = (start + index) * 1000 / Const.SAMPLEFREQ;
                lvi.SubItems.Add(value.ToString("f2"));
                lvi.SubItems.Add(dPoint.YValues[0].ToString("f4"));
                lvi.Font = new Font("宋体", 10, FontStyle.Bold);
                listViewWave.Items.Add(lvi);

                lvi = new ListViewItem();
                lvi.Text = "差值";
                float lastV = float.Parse(listViewWave.Items[0].SubItems[1].Text);
                lvi.SubItems.Add((value - lastV).ToString("f2"));
                lvi.SubItems.Add((WaveDataPointFirst.YValues[0] - dPoint.YValues[0]).ToString("f4"));
                lvi.Font = new Font("宋体", 10, FontStyle.Bold);
                listViewWave.Items.Add(lvi);
            }
        }

        #endregion //波形区域的绘画操作


        #region 频谱波形公用部分
        //数据点获得光标时的状态
        private void CursorDataPoint(ref DataPoint dpoint)
        {
            dpoint.IsValueShownAsLabel = true;
            dpoint.MarkerSize = 8;
            dpoint.MarkerColor = Color.Green;
            dpoint.MarkerStyle = MarkerStyle.Cross;
        }


        //数据点被按下时的状态
        private void PressDataPoint(ref DataPoint dpoint)
        {
            dpoint.IsValueShownAsLabel = true;
            dpoint.MarkerSize = 8;
            dpoint.MarkerColor = Color.Red;
            dpoint.MarkerStyle = MarkerStyle.Diamond;
        }


        //数据点恢复到原始状态
        private void ReleaseDataPoint(ref DataPoint dpoint)
        {
            dpoint.IsValueShownAsLabel = false;
            dpoint.MarkerSize = 2;
            dpoint.MarkerColor = Color.Blue;
            dpoint.MarkerStyle = MarkerStyle.Circle;
            dpoint = null;
        }


        //倍频点选中的状态
        private void GainFreqDataPoint(ref DataPoint dpoint)
        {
            dpoint.IsValueShownAsLabel = true;
            dpoint.MarkerSize = 12;
            dpoint.MarkerColor = Color.Purple;
            dpoint.MarkerStyle = MarkerStyle.Triangle;
        }

        private Boolean GetZoomStartEndInRect(Chart tempChart,Point startP,Point endP,ref int startIndex,ref int endIndex)
        {
            Point startPoint = startP;
            Point endPoint = endP;
            int findLeftV = -1;
            int findRightV = -1;

            if (startP == endP)
                return false;

            if (startP.X > endP.X)
            {
                startPoint = endP;
                endPoint = startPoint;
            }

            int xAxisLength = endPoint.X - startPoint.X;
            int yAxisLength = endPoint.Y - startPoint.Y;


            //得到左边的值
            for (int i = 0; i < xAxisLength; i++)
            {
                Point tempPoint = startPoint;
                tempPoint.X += i;;
                for (int j = 0; j < yAxisLength; j++)
                {
                    tempPoint.Y++;
                    HitTestResult hitResult = tempChart.HitTest(tempPoint.X, tempPoint.Y);
                    if (hitResult.ChartElementType == ChartElementType.DataPoint)
                    {
                        findLeftV = hitResult.PointIndex;
                        break;
                    }
                }
                if (findLeftV != -1)
                    break;
            }

            //得到右边的值
            for (int i = 0; i < xAxisLength; i++)
            {
                Point tempPoint = endPoint;
                tempPoint.X-=i;
                for (int j = 0; j < yAxisLength; j++)
                {
                    tempPoint.Y--;
                    HitTestResult hitResult = tempChart.HitTest(tempPoint.X, tempPoint.Y);
                    if (hitResult.ChartElementType == ChartElementType.DataPoint)
                    {
                        findRightV = hitResult.PointIndex;
                        break;
                    }
                }
                if (findRightV != -1)
                    break;
            }

            startIndex = findLeftV;
            endIndex = findRightV;
            if (findRightV == -1 || findLeftV == -1)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        #endregion //频谱波形公用部分

        private void ChartFreq_MouseLeave(object sender, EventArgs e)
        {
            this.Cursor = Cursors.Default;
        }

    }
}

原创粉丝点击