drawdlgpower.cpp
来自「一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.」· C++ 代码 · 共 1,213 行 · 第 1/3 页
CPP
1,213 行
// DrawDlgPower.cpp : implementation file
//
#include "stdafx.h"
#include "TestForm.h"
#include "DrawDlgPower.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define datasize 128
/////////////////////////////////////////////////////////////////////////////
// DrawDlgPower dialog
DrawDlgPower::DrawDlgPower(CWnd* pParent /*=NULL*/)
: CDialog(DrawDlgPower::IDD, pParent)
{
//{{AFX_DATA_INIT(DrawDlgPower)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
////---------------------------------------////
/*数据数组的初始化*/
for(int i=0;i<10;i++)
{
data_Peak[i]=0;
data_Peak_pos[i]=0;
}
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_bOpenData =FALSE; //打开数据
m_bSaveBitmap=TRUE; //保存位图(保存试验实时曲线)标志
m_bBitmapReady=FALSE; //位图(保存试验实时曲线)创建成功
/*整型变量的初始化*/
m_nDrawType = 1; //画图类型
m_GridX=9; //x向网格数
m_GridY=19; //Y向网格数
m_LineWidth=1; //画笔粗细
m_nHitnember=1; //图形显示类型,效率-时间曲线
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; //X轴最大值
m_dMin_Y=0.0; //X轴最大值
/*字符串变量的初始化*/
Uint_X="时间(S)"; //X坐标轴名称
Uint_Y="效率"; //Y坐标轴名称
//Title="效率试验 效率-时间曲线"; //标题名称
Title="效率试验绘图窗口"; //标题名称
/*颜色变量的初始化*/
m_LineColor =RGB(255,0,0); //实时曲线颜色初始化
m_FontColor =RGB(0,10,100); //字体颜色初始化
//m_LabelColor=RGB(128, 128, 128);
m_BkColor=RGB(255,255,255); //绘图区背景颜色初始化
m_LabelColor=RGB(224, 223, 227);//除实时显示区域外的颜色初始化
////---------------------------------------////
}
void DrawDlgPower::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DrawDlgPower)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DrawDlgPower, CDialog)
//{{AFX_MSG_MAP(DrawDlgPower)
ON_WM_PAINT()
ON_WM_CONTEXTMENU()
ON_MESSAGE(WM_MOTDLGPORSTART_HIT,OnMotpowstarthit)
ON_MESSAGE(WM_POWERDAQ_FINISH,OnPowerDaqFinish)
ON_MESSAGE(WM_OPENDATA,OnOpendata)
ON_MESSAGE(WM_DRAWTYPE_SELECT,OnDrawtypeSelect)
ON_COMMAND(ID_MENU_SAVEBITMAP, OnMenuSavebitmap)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DrawDlgPower message handlers
//////////////////////////////////////////////
BOOL DrawDlgPower::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
//InitDlg();//初始化
CreateMyFont();//创建字体
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void DrawDlgPower::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();
DrawTitle(&m_pMemory);//画题目
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);//画曲线
//DrawLabelX(&m_pMemory,3,0);//画X轴刻度
//DrawLabelY(&m_pMemory,m_dMax_Y,m_dMin_Y);//画Y轴刻度
//MessageBox("123");
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 DrawDlgPower::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)));
m_pMemory.SelectObject(&pOldBmp);
//MessageBox("123");
DistributeRect();
ReleaseDC(pDC);
}
//获得各个区域所对应的矩形
//格式:CRect(left,top,right,bottom)
void DrawDlgPower::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 DrawDlgPower::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 DrawDlgPower::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; //标定幅值最小值
switch(m_nHitnember)
{
case 1:
m_max_Y = 1.5;
m_min_Y = 0;
break;
case 2:
m_max_Y = 25;
m_min_Y = -25;
break;
case 3:
m_max_Y = 30;
m_min_Y = -30;
break;
default:
m_max_Y = 0;
m_min_Y = 0;
break;
}
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(64-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);
//MessageBox("1");
}
else
MessageBox("没有获取到实时数据!");
}
//画标题区域
void DrawDlgPower::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 DrawDlgPower::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 DrawDlgPower::DrawTitleY(CDC *pDC)
{
pDC->FillRect(m_LabelRect_Y,&CBrush(m_LabelColor));
//pDC->FillRect(m_LabelRect_Y,&CBrush(RGB(212,208,200)));
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?