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