?? drawdlgblanke.cpp
字號:
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 DrawDlgBlanke::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 DrawDlgBlanke::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",Xmin_time+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 DrawDlgBlanke::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 DrawDlgBlanke::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();
/*設定圖形信息顯示坐標*/
pDC->SelectObject(&Title_Font);
pDC->SetBkMode(TRANSPARENT);//設置為透明
pDC->SetTextAlign(TA_CENTER);//設置為字體居中
//標題
int a_t=m_TextOutRect.left+xwidth/2-10;
int b_t=m_TextOutRect.bottom/5+10;
pDC->TextOut(a_t,b_t,"圖形信息");
pDC->SetTextAlign(TA_LEFT);
//str3.Format("%s",Uint_X);
str3= "點數";
//str4.Format("%s",Uint_Y);
str4= "峰值";
pDC->SelectObject(&Message_Bottom);
pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+95,"統計信息");
pDC->SelectObject(&Label_Font_X);
str1.Format("平均值:%5.2f",m_Average);
str2.Format("均方值:%5.2f",m_ds);
str3.Format("最大值:%5.4f",m_dMax_Y);
str4.Format("最小值:%5.4f",m_dMin_Y);
pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+113,str1);
pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+123,str2);
pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+133,str3);
pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+143,str4);
/*峰值信息*/
pDC->SelectObject(&Message_Bottom);
pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+165,"峰值信息");
pDC->SelectObject(&Label_Font_X);
str3.Format("%s",Uint_X);
str4= "峰值";
pDC->TextOut(m_TextOutRect.left+4,m_TextOutRect.top+180,"序號");
pDC->TextOut(m_TextOutRect.left+32,m_TextOutRect.top+180,str4);
pDC->TextOut(m_TextOutRect.left+65,m_TextOutRect.top+180,str3);
double peak;
long pos;
int peakn;
long startpos;
if (m_bDataReady)//數據準備好
{
startpos=(long)m_dMin_X;
GetPeakData();//得到峰值信息
if(m_Peak_Num>10)
peakn=10;
else
peakn=m_Peak_Num;
for(int i=0;i<peakn;i++)
{
peak=data_Peak[i];
pos=data_Peak_pos[i];
str1.Format("%d ",i+1);
str2.Format("%5.3f",peak);
str3.Format("%d",pos+startpos);
//MessageBox(str3);
pDC->TextOut(m_TextOutRect.left+10,m_TextOutRect.top+195+i*15,str1);
pDC->TextOut(m_TextOutRect.left+30,m_TextOutRect.top+195+i*15,str2);
pDC->TextOut(m_TextOutRect.left+72,m_TextOutRect.top+195+i*15,str3);
}
}
pDC->SelectObject(OldFont);
}
//得到峰值信息
void DrawDlgBlanke::GetPeakData()
{
double *temp=new double [m_Y_Long];
long *temp_pos=new long [m_Y_Long];
//調用求峰值函數
m_Peak_Num=calculate_blanke.FindPeak(dataShow_Y,temp,temp_pos,m_Y_Long);
//從大到小排序
calculate_blanke.Bub(temp,temp_pos,m_Peak_Num);
//取前10個
for(int i=0;i<10;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 DrawDlgBlanke::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 DrawDlgBlanke::OnMotBlanstarthit(WPARAM wParam, LPARAM lParam)
{
//繪圖區標題設定
Uint_X="點數"; //X坐標軸名稱
Uint_Y="空程回差值(度)"; //Y坐標軸名稱
Title="空程回差試驗 誤差曲線"; //標題名稱
//繪圖類型設置
m_nDrawType =2;
//開始試驗
m_bStartOn=TRUE;
//觸發畫圖
Invalidate(FALSE);
}
//右鍵點擊菜單
void DrawDlgBlanke::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_BLANKDRAW_RBDMENU);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
}
//保存位圖
void DrawDlgBlanke::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 DrawDlgBlanke::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 DrawDlgBlanke::OnOpendata(WPARAM wParam, LPARAM lParam)
{
//MessageBox("2");
/*--相當于點擊主控窗口中的開始按鈕-開始--*/
m_bStartOn = TRUE; //開始試驗標志為真
Uint_X="點數"; //X坐標軸名稱
Uint_Y="空程回差值(度)"; //Y坐標軸名稱
Title="空程回差試驗 誤差曲線"; //標題名稱
m_nDrawType = 2;
Invalidate(FALSE);
/*--相當于點擊主控窗口中的開始按鈕-結束--*/
CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
//繪制實時曲線
m_nDrawType =3;
long number;
number = pApp->pCTestFormDoc->nPowerNumber; //數據個數
m_X_Long=number; //x向數組大小
m_Y_Long=number; //y向數組大小
//定義各個數據數組
double *CoderDataSort=new double [number];//存放處理后的數據
double *pPosition=new double [number];//存放點數即X軸坐標,為保持獲取數據函數的
//完整性,固將其定義為雙精度
for (int j=0;j<number;j++)
{
CoderDataSort[j] = pApp->pCTestFormDoc->Berrordata[j];
}
/*定義需要顯示數組的最大最小值*/
//定義最大值
double max_ErrorData;
//定義最小值
double min_ErrorData;
//獲取最大,最小值
max_ErrorData=calculate_blanke.FindMax(CoderDataSort,number);
min_ErrorData=calculate_blanke.FindMin(CoderDataSort,number);
m_Average=calculate_blanke.GetAverage(CoderDataSort,number);
m_ds=calculate_blanke.GetRoot(CoderDataSort,number);
//獲取時間坐標刻度
for (int i=0;i<number;i++)
{
pPosition[i]=i;
}
m_dMax_Y = max_ErrorData;
m_dMin_Y = min_ErrorData;
m_dMax_X = pPosition[number-1];
m_dMin_X = pPosition[0];
GetData(CoderDataSort,pPosition,number,number);
//繪制實時曲線
Invalidate(FALSE);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -