?? drawdlgblanke.cpp
字號:
// DrawDlgBlanke.cpp : implementation file
//
#include "stdafx.h"
#include "TestForm.h"
#include "DrawDlgBlanke.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// DrawDlgBlanke dialog
DrawDlgBlanke::DrawDlgBlanke(CWnd* pParent /*=NULL*/)
: CDialog(DrawDlgBlanke::IDD, pParent)
{
//{{AFX_DATA_INIT(DrawDlgBlanke)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
////---------------------------------------////
/*數據數組的初始化*/
for (int i=0;i<10;i++)
{
data_Peak[i]=0; //最多顯示10個最大的峰值,并按從大到小排序
data_Peak_pos[i]=0; //10個最大幅值對應的位置
}
dataShow_Y=NULL;
dataShow_X=NULL;
pOldBmp =NULL;//原有位圖
pBits=NULL; //保存位圖相關
pBitMap=NULL; //保存位圖相關
/*布爾變量的初始化*/
m_bInitflag =TRUE; //初始化對話框
m_bGridOn =TRUE; //畫網格
m_bStartOn = FALSE; //開始試驗
m_bDrawOn =FALSE; //開始畫實時曲線
m_bDataReady =FALSE; //數據獲取完成
m_bSaveBitmap =TRUE; //保存位圖(保存試驗實時曲線)標志
m_bBitmapReady =FALSE; //位圖(保存試驗實時曲線)創建成功
/*整型變量的初始化*/
m_nDrawType = 1; //畫圖類型
m_GridX=9; //x向網格數
m_GridY=19; //Y向網格數
m_LineWidth=1; //畫筆粗細
m_nHitnember=0; //樹型控件點擊
m_Peak_Num=0; //峰值個數為0
m_X_Long=0; //x向數組大小
m_Y_Long=0; //y向數組大小
/*浮點數變量初始化*/
m_Average=0.0; //平均值
m_ds=0.0; //均方值
m_dMax_X=0.0; //X軸最大值
m_dMin_X=0.0; //X軸最小值
m_dMax_Y=0.0; //y軸最大值
m_dMin_Y=0.0; //y軸最小值
m_dError=0.0; //回差值
/*字符串變量的初始化*/
Uint_X="轉矩(N.mm)"; //X坐標軸名稱
Uint_Y="轉動角度(min)"; //Y坐標軸名稱
//Title="空程回差試驗 機械滯回曲線"; //標題名稱
Title="空程回差試驗繪圖窗口"; //標題名稱
/*顏色變量的初始化*/
m_FontColor =RGB(0,10,100); //字體顏色初始化
//m_LabelColor=RGB(128, 128, 128);
m_LineColor=RGB(255,0,0); //實時曲線顏色初始化
m_BkColor=RGB(255,255,255); //繪圖區背景顏色初始化
m_LabelColor=RGB(224, 223, 227);//除實時顯示區域外的顏色初始化
////---------------------------------------////
}
void DrawDlgBlanke::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DrawDlgBlanke)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DrawDlgBlanke, CDialog)
//{{AFX_MSG_MAP(DrawDlgBlanke)
ON_WM_PAINT()
ON_MESSAGE(WM_MOTDLGBLANSTART_HIT,OnMotBlanstarthit)
ON_MESSAGE(WM_OPENDATA,OnOpendata)
ON_WM_CONTEXTMENU()
ON_COMMAND(ID_MENU_SAVEBITMAP, OnMenuSavebitmap)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DrawDlgBlanke message handlers
//////////////////////////////////
BOOL DrawDlgBlanke::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CreateMyFont();//創建字體
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void DrawDlgBlanke::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
////---------------------------------------////
GetClientRect(&m_ClientRect);
if (m_bStartOn)
{
if(m_bSaveBitmap)
{
CreatBitmap();//創建需要保存的位圖
m_bSaveBitmap =FALSE;
m_bBitmapReady=TRUE;//位圖(保存試驗實時曲線)創建成功
}
}
switch(m_nDrawType)
{
case 1:
if(m_bInitflag)
InitDlg();
DrawGrid(&m_pMemory);//畫網格
DrawTitle(&m_pMemory);//畫題目
dc.BitBlt(m_ClientRect.left,m_ClientRect.top,m_ClientRect.Width(),
m_ClientRect.Height(),&m_pMemory,0,0,SRCCOPY);
break;
case 2:
DrawGrid(&m_pMemory);//畫網格
DrawTitle(&m_pMemory);//畫題目
//MessageBox("1");
DrawTitleX(&m_pMemory);//畫X軸標題
DrawTitleY(&m_pMemory);//畫Y軸標題
DrawMessage(&m_pMemory);//畫顯示信息
dc.BitBlt(m_ClientRect.left,m_ClientRect.top,m_ClientRect.Width(),
m_ClientRect.Height(),&m_pMemory,0,0,SRCCOPY);
break;
case 3:
//DrawGrid(&m_pMemory);//畫網格
DrawTitle(&m_pMemory);//畫題目
DrawData(&m_pMemory);//畫曲線
DrawMessage(&m_pMemory);//畫顯示信息
dc.BitBlt(m_ClientRect.left,m_ClientRect.top,m_ClientRect.Width(),
m_ClientRect.Height(),&m_pMemory,0,0,SRCCOPY);
break;
default:
break;
}
CDialog::OnPaint();
////---------------------------------------////
// Do not call CDialog::OnPaint() for painting messages
}
//初始化對話框
void DrawDlgBlanke::InitDlg()
{
m_bInitflag = FALSE;
GetClientRect(&m_ClientRect);
CDC *pDC=GetDC();
CBitmap Bitmap;
m_pMemory.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,m_ClientRect.Width(),m_ClientRect.Height());
pOldBmp=m_pMemory.SelectObject(&memBitmap);
//m_pMemory.FillRect(m_ClientRect,&CBrush(RGB(236, 233, 216)));
m_pMemory.FillRect(m_ClientRect,&CBrush(RGB(224, 223, 227)));
//更新屏幕
//pDC->BitBlt(0,0,m_ClientRect.Width(),m_ClientRect.Height(),&m_pMemory,0,0,SRCCOPY);
m_pMemory.SelectObject(&pOldBmp);
//MessageBox("123");
DistributeRect();
ReleaseDC(pDC);
}
//創建字體
void DrawDlgBlanke::CreateMyFont()
{
LOGFONT Font;
memset(&Font, 0, sizeof(LOGFONT));
lstrcpy(Font.lfFaceName, "Times New Roman");
CWindowDC wdc(NULL) ;
const int cyPixels = wdc.GetDeviceCaps(LOGPIXELSY);
//標題用筆,粗體
Font.lfHeight = -1 * MulDiv(9, cyPixels, 72);
Font.lfUnderline=false;//不帶下劃線
Font.lfWeight = FW_BOLD ;
Title_Font.CreateFontIndirect(&Font);
//X軸標題顯示用字體
Font.lfHeight = -1 * MulDiv(8, cyPixels, 72);
Font.lfUnderline=false;//不帶下劃線
Font.lfWeight = FW_BOLD ;
Title_Font_X.CreateFontIndirect(&Font);
//Y軸標題顯示用字體
Font.lfWeight =FW_BOLD;
Font.lfOrientation = 900; // Rotate font 90 degree for x axis
Font.lfEscapement = 900;
Font.lfUnderline=false;//不帶下劃線
Font.lfHeight = -1 * MulDiv(8, cyPixels, 70);
Title_Font_Y.CreateFontIndirect(&Font);
//標定文字用筆,不加粗
Font.lfWeight = FW_THIN ;
Font.lfOrientation = 0; // Rotate font 90 degree for x axis
Font.lfEscapement = 0;
Font.lfUnderline=false;//不帶下劃線
Font.lfHeight = -1 * MulDiv(7, cyPixels, 70);
Label_Font_X.CreateFontIndirect(&Font);
//顯示信息標題用字體,帶下劃線,加粗
Font.lfHeight = -1 * MulDiv(8, cyPixels, 72);
Font.lfWeight = FW_THIN ;
Font.lfUnderline=true;//帶下劃線
Message_Bottom.CreateFontIndirect(&Font);
//顯示信息用字體,不帶下劃線,不加粗
Font.lfHeight = -1 * MulDiv(8, cyPixels, 72);
Font.lfWeight = FW_BOLD ;
Font.lfUnderline=FALSE;//帶下劃線
Message_Font.CreateFontIndirect(&Font);
//豎排顯示字體
//Font.lfWeight = FW_THIN ;
Font.lfWeight =FW_BOLD;
Font.lfOrientation = 900; // Rotate font 90 degree for x axis
Font.lfEscapement = 900;
Font.lfUnderline=false;//不帶下劃線
Font.lfHeight = -1 * MulDiv(8, cyPixels, 70);
Label_Font_Y.CreateFontIndirect(&Font);
}
//獲得各個區域所對應的矩形
//格式:CRect(left,top,right,bottom)
void DrawDlgBlanke::DistributeRect()
{
CRect r;
GetClientRect(&r);//先得到整個窗口的大小
int nWidth=r.Width();//得到整個窗口的寬度
int nHeigh=r.Height();//得到整個窗口的高度
/*分五個矩形出來,左邊是y向標定矩形,中間是繪圖矩形,上為標題矩形,
下為x向標定矩形,右為信息顯示矩形*/
int label_w=nWidth/16;//調整y向標定矩形的寬度
int title_h=nHeigh/10;//調整標題矩形的高度
int label_h=nHeigh/10;//調整x向標定矩形的高度
int message_w=nWidth/7;//調整信息顯示矩形的寬度
m_LabelRect_Y=CRect(r.left,r.top,r.left+label_w,r.bottom-label_h);
m_LabelRect_X=CRect(r.left,r.bottom-label_h,r.right,r.bottom);
m_TitleRect =CRect(r.left+label_w,r.top,r.right-message_w,r.top+title_h);
m_TextOutRect=CRect(r.right-message_w,r.top,r.right,r.bottom-label_h);
m_PlotRect =CRect(r.left+label_w,r.top+title_h,r.right-message_w,r.bottom-label_h);
}
//畫網格
void DrawDlgBlanke::DrawGrid(CDC *pDC)
{
pDC->FillRect(m_PlotRect,&CBrush(RGB(255,255,255)));
CPen pen2(PS_SOLID,1,RGB(0,0,0));//畫網格邊界的畫筆
CPen pen1(PS_SOLID,1,RGB(192,192,192));//畫網格內部的畫筆
CPen* oldpen=pDC->SelectObject(&pen1);
int i;
double GridHeigth=1.0*(m_PlotRect.bottom-m_PlotRect.top)/(m_GridY+1);
double GridWidth=1.0*(m_PlotRect.right-m_PlotRect.left)/(m_GridX+1);
if(m_bGridOn)
{
for (i=1;i<m_GridY+1;i++)
{
pDC->MoveTo(m_PlotRect.left,m_PlotRect.top+int(i*GridHeigth));
pDC->LineTo(m_PlotRect.right,m_PlotRect.top+int(i*GridHeigth));
}
for (i=1;i<m_GridX+1;i++)
{
pDC->MoveTo(m_PlotRect.left+int(i*GridWidth),m_PlotRect.top);
pDC->LineTo(m_PlotRect.left+int(i*GridWidth),m_PlotRect.bottom);
}
pDC->SelectObject(&pen2);
//畫邊框
pDC->MoveTo(m_PlotRect.left,m_PlotRect.top);
pDC->LineTo(m_PlotRect.right-1,m_PlotRect.top);
pDC->LineTo(m_PlotRect.right-1,m_PlotRect.bottom-1);
pDC->LineTo(m_PlotRect.left,m_PlotRect.bottom-1);
pDC->LineTo(m_PlotRect.left,m_PlotRect.top);
}
pDC->SelectObject(oldpen);
}
//繪制數據,并得到讀數信息
void DrawDlgBlanke::DrawData(CDC *pDC)
{
if (m_bDataReady) //數據獲取成功
{
pDC->FillRect(m_PlotRect,&CBrush(m_BkColor));
//設置畫筆
CPen LinePen,ReadPen;
LinePen.CreatePen(PS_SOLID,m_LineWidth,m_LineColor);
ReadPen.CreatePen(PS_SOLID,m_LineWidth,RGB(0,255,255));
CPen* oldpen=pDC->SelectObject(&LinePen);
long ny_T=m_PlotRect.bottom-m_PlotRect.top;
long nx_T=m_PlotRect.right-m_PlotRect.left;
/*
CString str;
str.Format("%d,%d",ny_T,nx_T);
MessageBox(str);
*/
/*設置繪圖諸元*/
//各軸放大倍數
double scale_X; //X軸放大倍數
double scale_Y; //Y軸放大倍數
//各軸實際數據間距
double disdant_X; //X軸實際數據間距
double disdant_Y; //Y軸實際數據間距
//Y軸標定最值
//double m_max_Y=m_dMax_Y; //標定幅值最大值
//double m_min_Y=m_dMin_Y; //標定幅值最小值
double m_max_Y; //標定幅值最大值
double m_min_Y; //標定幅值最小值
m_max_Y = 1;
m_min_Y = 0.3;
disdant_Y=fabs(m_max_Y-m_min_Y);//Y軸實際數據間距
//sdant_Y=fabs(1.5-0);//Y軸實際數據間距
if(disdant_Y<=0)
disdant_Y=1;
scale_Y=ny_T/disdant_Y; //Y軸放大倍數
// double m_scale_Y=1.0*Heigh_T/(m_max_Y-m_min_Y);//放縮的倍數
//X軸標定最值
double m_max_X=m_dMax_X; //標定幅值最大值
double m_min_X=m_dMin_X; //標定幅值最小值
disdant_X=fabs(m_max_X-m_min_X);//X軸實際數據間距
//disdant_X=fabs(72-1);//X軸實際數據間距
if(disdant_X<=0)
disdant_X=1;
scale_X=nx_T/disdant_X; //X軸放大倍數
// double m_scale_X=1.0*Width_T/(m_max_X-m_min_X);//放縮的倍數
//繪制坐標軸標題及刻度
DrawLabelX(&m_pMemory,m_max_X,m_min_X);
DrawLabelY(&m_pMemory,m_max_Y,m_min_Y);
//DrawLabelY(&m_pMemory,1.5,0);
DrawGrid(&m_pMemory);//畫網格
//繪制實時曲線
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);
}
else
MessageBox("沒有獲取到實時數據!");
}
//畫標題區域
void DrawDlgBlanke::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 DrawDlgBlanke::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);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -