📄 drawdlgover.cpp
字号:
//绘制实时曲线
long x_temp;
long y_temp;
long i;
y_temp=(long) (m_PlotRect.bottom-(dataShow_Y[0]-m_min_Y)*scale_Y);
x_temp=(long) (m_PlotRect.left+(dataShow_X[0]-m_min_X)*scale_X);
//y_temp=m_PlotRect.bottom;
//x_temp=m_PlotRect.left;
pDC->MoveTo(x_temp,y_temp);
for(i=1;i<m_Y_Long;i++)
{
y_temp=(long) (m_PlotRect.bottom-(dataShow_Y[i]-m_min_Y)*scale_Y);
x_temp=(long) (m_PlotRect.left+(dataShow_X[i]-m_min_X)*scale_X);
pDC->LineTo(x_temp,y_temp);
}
pDC->SelectObject(oldpen);
//MessageBox("1");
}
else
MessageBox("没有获取到实时数据!");
}
//画标题区域
void DrawDlgOver::DrawTitle(CDC *pDC)
{
pDC->FillRect(m_TitleRect,&CBrush(m_LabelColor));
//pDC->FillRect(m_TitleRect,&CBrush(RGB(212,208,200)));
CFont *OldFont;
OldFont=pDC->SelectObject(&Title_Font);
pDC->SetBkMode(TRANSPARENT);//设置为透明
pDC->SetTextAlign(TA_CENTER);//设置为字体居中
int a_t=(m_TitleRect.left+m_TitleRect.right)/2;
int b_t=m_TitleRect.bottom-m_TitleRect.Height()/2-5;
//MessageBox("1");
pDC->TextOut(a_t,b_t,Title);
pDC->SelectObject(OldFont);
}
//显示X坐标轴名称和单位
void DrawDlgOver::DrawTitleX(CDC *pDC)
{
pDC->FillRect(m_LabelRect_X,&CBrush(m_LabelColor));
//pDC->FillRect(m_LabelRect_X,&CBrush(RGB(212,208,200)));
//设置字体
CFont *pOldfond=NULL;
pDC->SetTextAlign(TA_CENTER);//中间靠齐
pDC->SetBkMode(TRANSPARENT);
pDC->SelectObject(&Title_Font_X);
CString str;
CPoint pp;
//画坐标轴名称
pp.x=m_PlotRect.left+m_PlotRect.Width()/2-5;
pp.y=m_LabelRect_X.bottom-m_LabelRect_X.Height()/2-2;
str.Format("%s",Uint_X);
pDC->TextOut(pp.x,pp.y,str);
pDC->SelectObject(pOldfond);
}
//显示Y坐标轴名称和单位
void DrawDlgOver::DrawTitleY(CDC *pDC)
{
pDC->FillRect(m_LabelRect_Y,&CBrush(m_LabelColor));
//pDC->FillRect(m_LabelRect_Y,&CBrush(RGB(212,208,200)));
//设置字体
CFont *pOldfond=NULL;
pDC->SetTextAlign(TA_LEFT);//左靠齐
pDC->SetBkMode(TRANSPARENT);
pOldfond=pDC->SelectObject(&Title_Font_Y);//选用横向显示字体
CString str ;
CPoint pp;
//画坐标轴名称
pDC->SetTextAlign(TA_CENTER);
pp.x=m_LabelRect_Y.left+5;
pp.y=m_PlotRect.bottom-m_PlotRect.Height()/2;
//显示
str.Format("%s",Uint_Y);
pDC->TextOut(pp.x,pp.y,str);
pDC->SelectObject(pOldfond);
}
//画x轴的示数
void DrawDlgOver::DrawLabelX(CDC *pDC, double Xmax_time, double Xmin_time)
{
pDC->FillRect(m_LabelRect_X,&CBrush(m_LabelColor));
//pDC->FillRect(m_LabelRect_X,&CBrush(RGB(212,208,200)));
//设置字体
CFont *pOldfond=NULL;
pDC->SetTextAlign(TA_CENTER);//中间靠齐
pDC->SetBkMode(TRANSPARENT);
pOldfond=pDC->SelectObject(&Label_Font_X);
CString str ;
CPoint pp;
double XStep=(Xmax_time-Xmin_time)/(m_GridX+1);
for (int i=0;i<m_GridX+2;i++)
{
pp.x=m_PlotRect.left+i*m_PlotRect.Width()/(m_GridX+1);
pp.y=m_LabelRect_X.top;
str.Format("%5.2f",i*XStep);
pDC->TextOut(pp.x,pp.y,str);
}
//显示坐标轴名称和单位
pDC->SelectObject(&Title_Font_X);
pp.x=m_PlotRect.left+m_PlotRect.Width()/2-5;
pp.y=m_LabelRect_X.bottom-m_LabelRect_X.Height()/2-2;
str.Format("%s",Uint_X);
pDC->TextOut(pp.x,pp.y,str);
pDC->SelectObject(pOldfond);
}
//画Y轴的示数
void DrawDlgOver::DrawLabelY(CDC *pDC, double Ymax_time, double Ymin_time)
{
pDC->FillRect(m_LabelRect_Y,&CBrush(m_LabelColor));
//pDC->FillRect(m_LabelRect_Y,&CBrush(RGB(212,208,200)));
//设置字体
CFont *pOldfond=NULL;
pDC->SetTextAlign(TA_LEFT);//左靠齐
pDC->SetBkMode(TRANSPARENT);
pOldfond=pDC->SelectObject(&Label_Font_X);//选用横向显示字体
CString str ;
CPoint pp;
double YStep=(Ymax_time-Ymin_time)/(m_GridY+1);
for (int i=0;i<m_GridY+2;i++)
{
pp.y=m_PlotRect.bottom-i*m_PlotRect.Height()/(m_GridY+1)-6;
pp.x=m_LabelRect_Y.left+m_LabelRect_Y.Width()/2-2;
str.Format("%5.2f",Ymin_time+i*YStep);
pDC->TextOut(pp.x,pp.y,str);
}
//画坐标轴名称
pDC->SelectObject(Label_Font_Y);
pDC->SetTextAlign(TA_CENTER);
pp.x=m_LabelRect_Y.left+5;
pp.y=m_PlotRect.bottom-m_PlotRect.Height()/2;
//显示
str.Format("%s",Uint_Y);
pDC->TextOut(pp.x,pp.y,str);
pDC->SelectObject(pOldfond);
}
//画显示信息
void DrawDlgOver::DrawMessage(CDC *pDC)
{
pDC->FillRect(m_TextOutRect,&CBrush(m_LabelColor));
//pDC->FillRect(m_TextOutRect,&CBrush(RGB(212,208,200)));
CString str1,str2,str3,str4;
CFont *OldFont;
OldFont=pDC->SelectObject(&Title_Font);
pDC->SetBkMode(TRANSPARENT);//设置为透明
pDC->SetTextAlign(TA_CENTER);//设置为字体居中
//得到信息窗口的高度和宽度
long xwidth=m_TextOutRect.Width();
long yheigh=m_TextOutRect.Height();
//设定坐标
int a_t=m_TextOutRect.left+xwidth/2-10;
int b_t=m_TextOutRect.bottom/8;
pDC->TextOut(a_t,b_t,"图形信息");
pDC->SetTextAlign(TA_LEFT);
str3.Format("%s",Uint_X);
//str4.Format("%s",Uint_Y);
str4= "峰值";
pDC->SelectObject(&Message_Bottom);
pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+65,"统计信息");
pDC->SelectObject(&Label_Font_X);
str1.Format("平均值:%5.2f",m_Average);
str2.Format("均方值:%5.2f",m_ds);
pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+81,str1);
pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+91,str2);
/*峰值信息*/
pDC->SelectObject(&Message_Bottom);
pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+115,"峰值信息");
pDC->SelectObject(&Label_Font_X);
pDC->TextOut(m_TextOutRect.left+4,m_TextOutRect.top+132,"序号");
pDC->TextOut(m_TextOutRect.left+27,m_TextOutRect.top+132,str4);
pDC->TextOut(m_TextOutRect.left+52,m_TextOutRect.top+132,str3);
double peak;
long pos;
if (m_bDataReady)//数据准备好
{
GetPeakData();//得到峰值信息
for(int i=0;i<m_Peak_Num;i++)
{
peak=data_Peak[i];
pos=data_Peak_pos[i];
str1.Format("%d ",i+1);
str2.Format("%5.2f",peak);
str3.Format("%d",pos);
pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+145+i*15,str1);
pDC->TextOut(m_TextOutRect.left+25,m_TextOutRect.top+145+i*15,str2);
pDC->TextOut(m_TextOutRect.left+57,m_TextOutRect.top+145+i*15,str3);
}
}
pDC->SelectObject(OldFont);
}
//得到峰值信息
void DrawDlgOver::GetPeakData()
{
double *temp=new double [m_Y_Long];
long *temp_pos=new long [m_Y_Long];
//调用求峰值函数
m_Peak_Num=calculate_over.FindPeak(dataShow_Y,temp,temp_pos,m_Y_Long);
//从大到小排序
calculate_over.Bub(temp,temp_pos,m_Peak_Num);
int peakn;
if(m_Y_Long>10)
peakn=10;
else
peakn=m_Y_Long;
//取前10个
for(int i=0;i<peakn;i++)
{
if(m_Peak_Num>10)
{
data_Peak[i]=temp[i];
data_Peak_pos[i]=temp_pos[i];
}
else
{
if(i<m_Peak_Num)
{
data_Peak[i]=temp[i];
data_Peak_pos[i]=temp_pos[i];
}
else
{
data_Peak[i]=0;
data_Peak_pos[i]=0;
}
}
}
//MessageBox("12");
delete [] temp_pos;
delete [] temp;
}
//获取采集窗口的数据
void DrawDlgOver::GetData(double *y,double *x,long x_Long,long y_Long)
{
//销毁以前的数据
if(dataShow_Y) { delete [] dataShow_Y; dataShow_Y=NULL;}
if(dataShow_X) { delete [] dataShow_X;dataShow_X=NULL;}
//传递大小
m_X_Long=x_Long;
m_Y_Long=y_Long;
//动态创建2个数组
dataShow_Y=new double [m_Y_Long];
dataShow_X=new double [m_X_Long];
int i;
//传递x向数据
for(i=0;i<m_X_Long;i++)
{
dataShow_X[i]=x[i];
}
//传递y向数据
for(i=0;i<m_Y_Long;i++)
{
dataShow_Y[i]=y[i];
}
//数据准备好
m_bDataReady=TRUE;
//Invalidate(false);
}
//效率仪读取数据达到设定值的消息响应函数
void DrawDlgOver::OnPowerDaqFinish(WPARAM wParam, LPARAM lParam)
{
CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
if (m_bStartOn)
{
//绘制实时曲线
m_nDrawType =3;
long number,totalnumber;
int ntimes;//一共有多少组
number = pApp->pCTestFormDoc->nPowerNumber; //每组数据个数
totalnumber = pApp->pCTestFormDoc->nTotalPowerNumber;//数据总数
ntimes = (int)(totalnumber/number);
//定义各个数据数组
double *PowerData=new double [number];
double *PowerInRate=new double [number];
//double *PowerOutRate=new double [number];
double *PowerInTorque=new double [number];
//double *PowerOutTorque=new double [number];
double *ptime=new double [number];//存放时间坐标
long *pPosition=new long [number];//存放位置
PowerData = pApp->pCTestFormDoc->pPowerData;
PowerInRate = pApp->pCTestFormDoc->pPowerInRate;
//PowerOutRate = pApp->pCTestFormDoc->pPowerOutRate;
PowerInTorque = pApp->pCTestFormDoc->pPowerInTorque;
//PowerOutTorque = pApp->pCTestFormDoc->pPowerOutTorque;
/*定义需要显示数组的最大最小值和统计信息*/
//定义最大值
double max_PowerData;
double max_PowerInRate;
double max_PowerInTorque;
//定义最小值
double min_PowerData;
double min_PowerInRate;
double min_PowerInTorque;
/*获取最大,最小值和统计信息*/
//效率
max_PowerData=calculate_over.FindMax(PowerData,number);
min_PowerData=calculate_over.FindMin(PowerData,number);
//输入转速
max_PowerInRate=calculate_over.FindMax(PowerData,number);
min_PowerInRate=calculate_over.FindMin(PowerData,number);
//输入扭矩
max_PowerInTorque=calculate_over.FindMax(PowerData,number);
min_PowerInTorque=calculate_over.FindMin(PowerData,number);
//获取时间坐标刻度
for (int i=0;i<number;i++)
{
ptime[i]=(totalnumber-number)+i;
pPosition[i]=(long)i;
}
switch(m_nHitnember)
{
case 1:
//MessageBox("1");
m_dMax_Y =max_PowerData;
m_dMin_Y =min_PowerData;
m_dMax_X =ptime[number-1];
m_dMin_X =ptime[0];
GetData(PowerData,ptime,number,number);
//获取统计信息
m_Average=calculate_over.GetAverage(PowerData,number);
m_ds=calculate_over.GetRoot(PowerData,number);
break;
case 2:
m_dMax_Y =max_PowerInRate;
m_dMin_Y =min_PowerInRate;
m_dMax_X =ptime[number-1];
m_dMin_X =ptime[0];
GetData(PowerInRate,ptime,number,number);
//获取统计信息
m_Average=calculate_over.GetAverage(PowerInRate,number);
m_ds=calculate_over.GetRoot(PowerInRate,number);
//MessageBox("2");
break;
case 3:
m_dMax_Y =max_PowerInTorque;
m_dMin_Y =min_PowerInTorque;
m_dMax_X =ptime[number-1];
m_dMin_X =ptime[0];
GetData(PowerInTorque,ptime,number,number);
//获取统计信息
m_Average=calculate_over.GetAverage(PowerInTorque,number);
m_ds=calculate_over.GetRoot(PowerInTorque,number);
//MessageBox("3");
break;
default:
break;
}
//销毁各个数组
delete [] ptime;
delete [] pPosition;
delete [] PowerData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -