📄 drawdlgresp.cpp
字号:
void DrawDlgResp::DrawTitleY(CDC *pDC)
{
pDC->FillRect(m_LabelRect_Y,&CBrush(m_LabelColor));
//设置字体
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 DrawDlgResp::DrawLabelX(CDC *pDC, double Xmax_time, double Xmin_time)
{
pDC->FillRect(m_LabelRect_X,&CBrush(m_LabelColor));
//pDC->FillRect(m_LabelRect_X,&CBrush(RGB(255,255,255)));
//设置字体
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 DrawDlgResp::DrawLabelY(CDC *pDC, double Ymax_time, double Ymin_time)
{
pDC->FillRect(m_LabelRect_Y,&CBrush(m_LabelColor));
//pDC->FillRect(m_LabelRect_Y,&CBrush(RGB(255,255,255)));
//设置字体
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 DrawDlgResp::DrawMessage(CDC *pDC)
{
pDC->FillRect(m_TextOutRect,&CBrush(m_LabelColor));
//pDC->FillRect(m_TextOutRect,&CBrush(RGB(255,255,255)));
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+20;
pDC->TextOut(a_t,b_t,"超调量");
//数据
a_t=m_TextOutRect.left+xwidth/2-10;
b_t=m_TextOutRect.bottom/8+40;
str1.Format("%5.2f",m_dOverdata);
pDC->TextOut(a_t,b_t,str1);
/*设定上升时间标题及数据显示坐标*/
//标题
a_t=m_TextOutRect.left+xwidth/2-10;
b_t=m_TextOutRect.bottom/5+50;
pDC->TextOut(a_t,b_t,"上升时间(s)");
//数据
a_t=m_TextOutRect.left+xwidth/2-10;
b_t=m_TextOutRect.bottom/5+70;
str1.Format("%5.2f",m_dRisetime);
pDC->TextOut(a_t,b_t,str1);
/*设定稳定时间标题及数据显示坐标*/
//标题
a_t=m_TextOutRect.left+xwidth/2-10;
b_t=m_TextOutRect.bottom/5+110;
pDC->TextOut(a_t,b_t,"稳定时间(s)");
//数据
a_t=m_TextOutRect.left+xwidth/2-10;
b_t=m_TextOutRect.bottom/5+130;
str1.Format("%5.2f",m_dStabletime);
pDC->TextOut(a_t,b_t,str1);
pDC->SelectObject(OldFont);
}
//得到峰值信息
void DrawDlgResp::GetPeakData()
{
double *temp=new double [m_Y_Long];
long *temp_pos=new long [m_Y_Long];
//调用求峰值函数
m_Peak_Num=calculate_resp.FindPeak(dataShow_Y,temp,temp_pos,m_Y_Long);
//从大到小排序
calculate_resp.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;
}
}
}
delete [] temp_pos;
delete [] temp;
}
//获取采集窗口的数据
void DrawDlgResp::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 DrawDlgResp::OnMotrespstarthit(WPARAM wParam, LPARAM lParam)
{
//绘图区标题设定
Uint_X="时间(s)"; //X坐标轴名称
Uint_Y="输出轴转速(RPM)";//Y坐标轴名称
Title="过度过程试验 转速-时间曲线"; //标题名称
//绘图类型设置
m_nDrawType =2;
//开始试验
m_bStartOn=TRUE;
//触发画图
Invalidate(FALSE);
}
void DrawDlgResp::OnPowerDaqFinish(WPARAM wParam, LPARAM lParam)
{
//MessageBox("123");
CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
if (m_bStartOn)
{
//绘制实时曲线
m_nDrawType =3;
long number;
number = pApp->pCTestFormDoc->nPowerNumber; //当前数据个数
//定义各个数据数组
//double *PowerData=new double [datasize];
//double *PowerDataSort=new double [datasize];//存放排序后的效率值
double *PowerOutRate=new double [datasize];
double *ptime=new double [datasize];//存放时间坐标
long *pPosition=new long [datasize];//存放位置
PowerOutRate = pApp->pCTestFormDoc->pPowerOutRate;
/*定义需要显示数组的最大最小值和统计值*/
//定义最大值
double max_PowerOutRate;
//定义最小值
double min_PowerOutRate;
//获取时间坐标刻度
for (int i=0;i<number;i++)
{
ptime[i]=i;
pPosition[i]=(long)i;
}
/*输出转速相关信息*/
//获取最大,最小值
max_PowerOutRate=calculate_resp.FindMax(PowerOutRate,number);
min_PowerOutRate=calculate_resp.FindMin(PowerOutRate,number);
m_dOverdata=max_PowerOutRate-8;
//获取统计值
m_Average=calculate_resp.GetAverage(PowerOutRate,number);
m_ds=calculate_resp.GetRoot(PowerOutRate,number);
m_dMax_Y =max_PowerOutRate;
m_dMin_Y =min_PowerOutRate;
m_dMax_X =ptime[number-1];
m_dMin_X =ptime[0];
GetData(PowerOutRate,ptime,number,number);
//绘制实时曲线
Invalidate(FALSE);
}
else
MessageBox("请点击主控窗口中的开始试验按钮按钮!");
}
//右键点击菜单
void DrawDlgResp::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_RESPDRAW_RBDMENU);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
}
//保存位图
void DrawDlgResp::OnMenuSavebitmap()
{
// TODO: Add your command handler code here
m_bSaveBitmap=TRUE; //保存位图(保存试验实时曲线)标志
Invalidate(FALSE); //触发画图
if (m_bBitmapReady)//位图创建成功
{
CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"位图文件(*.bmp)|*.bmp|",NULL);
if(dlg.DoModal()== IDOK)
{
CString filename = dlg.GetFileName() + ".bmp";
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = 'B';
*(((char *)&bmfh.bfType) + 1) = 'M';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
//文件头的这个变量表示的是文件的大小
TCHAR szBMPFileName[128];
//文件名
int iBMPBytes = iWidth * iHeight * iPixel / 8;
//位图总像素大小
strcpy(szBMPFileName,filename);
//获得文件名
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));//先写入文件头信息到文件中
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));//写入文件信息结构
file.Write(pBits,iBMPBytes);//写入位图像素数据信息
file.Close();
}
}
}
else //位图创建未成功
MessageBox("请先进行设备自检和开始试验操作试验!");
}
//创建位图
void DrawDlgResp::CreatBitmap()
{
//得到矩形大小
CRect rect;
GetClientRect(&rect);
iWidth =rect.Width();
iHeight =rect.Height();
iPixel = 32;
pBits = new byte[iWidth * iHeight * iPixel / 8];
//初始图形格式参数
//设置位图信息的bmiHeader分量信息,即位图的BITMAPINFOHEADER信息
lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;
//////////////////////////////////////////////////////////////////////////
hBitMap = CreateDIBSection(m_pMemory,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
//上条语句联系lpbmih信息以及pBits信息
pBitMap = new CBitmap;
pBitMap->Attach(hBitMap);//绑定
m_pMemory.SelectObject(pBitMap);
//m_pMemory.FillRect(m_ClientRect,&CBrush(m_BkColor));
}
//打开数据响应函数
void DrawDlgResp::OnOpendata(WPARAM wParam, LPARAM lParam)
{
//MessageBox("3");
/*--相当于点击主控窗口中的开始按钮-开始--*/
m_bStartOn = TRUE; //开始试验标志为真
Uint_X="时间(s)"; //X坐标轴名称
Uint_Y="输出轴转速(RPM)";//Y坐标轴名称
Title="过度过程试验 转速-时间曲线"; //标题名称
m_nDrawType = 2;
Invalidate(FALSE);
/*--相当于点击主控窗口中的开始按钮-结束--*/
CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
//绘制实时曲线
m_nDrawType =3;
long number;
number = pApp->pCTestFormDoc->nPowerNumber; //当前数据个数
//定义各个数据数组
double *PowerOutRate=new double [datasize];
double *ptime=new double [datasize];//存放时间坐标
long *pPosition=new long [datasize];//存放位置
PowerOutRate = pApp->pCTestFormDoc->pPowerOutRate;
/*定义需要显示数组的最大最小值和统计值*/
//定义最大值
double max_PowerOutRate;
//定义最小值
double min_PowerOutRate;
//获取时间坐标刻度
for (int i=0;i<number;i++)
{
ptime[i]=i;
pPosition[i]=(long)i;
}
/*输出转速相关信息*/
//获取最大,最小值
max_PowerOutRate=calculate_resp.FindMax(PowerOutRate,number);
min_PowerOutRate=calculate_resp.FindMin(PowerOutRate,number);
m_dOverdata=max_PowerOutRate-8;
m_dRisetime=8;
m_dStabletime=19;
m_dMax_Y =max_PowerOutRate;
m_dMin_Y =min_PowerOutRate;
m_dMax_X =ptime[number-1];
m_dMin_X =ptime[0];
GetData(PowerOutRate,ptime,number,number);
//绘制实时曲线
Invalidate(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -