📄 drawview.cpp
字号:
// DrawView.cpp : implementation of the CDrawView class
//
#include "stdafx.h"
#include "Draw.h"
#include "DrawDoc.h"
#include "DrawView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawView
IMPLEMENT_DYNCREATE(CDrawView, CView)
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_COMMAND(ID_START, OnStart)
ON_COMMAND(ID_STOP, OnStop)
ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
ON_UPDATE_COMMAND_UI(ID_START, OnUpdateStart)
ON_WM_CREATE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawView construction/destruction
CDrawView::CDrawView()
{
// TODO: add construction code here
MainWindowLeft = 100; // 左下角坐标为(100,300)
MainWindowBottom = 300;
max = 150; //合格产品的上限为150
min = 140; //合格产品的下限为140
Status =0; //程序启动时,处于未监测状态
timerID = 0; //第一个定时器
timerGap = 200; //200毫秒循环一次
pen[0].CreatePen(PS_SOLID,1,RGB(0,0,0)); //黑色画笔
pen[1].CreatePen(PS_SOLID,1,RGB(255,0,0)); //红色画笔
pen[2].CreatePen(PS_SOLID,1,RGB(0,255,0)); //绿色画笔
pen[3].CreatePen(PS_SOLID,1,RGB(0,0,255)); //蓝色画笔
pen[4].CreatePen(PS_DOT, 1,RGB(0,0,255)); //蓝色间断画笔
}
CDrawView::~CDrawView()
{
}
BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing
void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if (pDC != NULL)
pDC->BitBlt(0,0,winx, winy, pBackDC, 0, 0, SRCCOPY);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView printing
BOOL CDrawView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics
#ifdef _DEBUG
void CDrawView::AssertValid() const
{
CView::AssertValid();
}
void CDrawView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDrawDoc* CDrawView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc)));
return (CDrawDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawView message handlers
/*void CShow08View::OnTimer(UINT nIDEvent)
{
// TODO: Add your command handler code here
switch(nStatus)
{
case 1:
MainGraph();
break;
case 2:
TestGraph();
break;
}
CView::OnTimer(nIDEvent);
}
*/
void CDrawView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
// if(Status == 1) //如果处于监测状态
{
for(int j=MAXDATANUMBER - 1; j>0; j--)
{
Data[j] = Data[j-1];
}
if( dataFile.Read(&Data[0], sizeof(Data[0]) ) ) // 读数据成功
{
DrawPicture(); // 画图函数
CView::OnTimer(nIDEvent);
}
else
{
OnStop() ;
MessageBox("已到文件结尾!","提示信息");
}
}
}
void CDrawView::OnStart()
{
// TODO: Add your command handler code here
Status = 1; // 开始监测,设置Status为1
ResetData(); // 数据全部置为0
// 初始化系统定时器,每隔指定时间间隔,系统发送一个WM_TIMER消息
timerID = SetTimer(++timerID, timerGap, NULL);
dataFile.Open("Line1.Dat", CFile::modeRead); // 打开数据文件
}
void CDrawView::OnStop()
{
// TODO: Add your command handler code here
Status = 0; // 结束监测,设置Status为0
KillTimer(timerID); //关闭由前面用SetTimer初始化的定时器
timerID = 0; //timerID 设置为0
dataFile.Close(); //关闭数据文件
}
void CDrawView::ResetData()
{
for(int i=0; i<MAXDATANUMBER; i++)
Data[i] = 0;
}
void CDrawView::DrawPicture()
{
pBackDC->PatBlt(0,0,winx, winy, PATCOPY);
//画坐标轴及刻度
DrawCoordinate(pBackDC ,BLACKPEN, MainWindowLeft, MainWindowBottom - MAINHEIGHT, MainWindowLeft + MAINWIDTH, MainWindowBottom);
//标出x坐标刻度值
WriteCoordinateX(pBackDC, BLACKPEN, MainWindowLeft, MainWindowLeft + MAINWIDTH, MainWindowBottom);
//标出y坐标刻度值
WriteCoordinateY(pBackDC, max, min, BLACKPEN,MainWindowLeft, MainWindowBottom );
//输出实际宽度值
WriteMessage(pBackDC, MainWindowLeft, MainWindowBottom, MAINHEIGHT );
if ( pBackDC != NULL )
{
//画曲线图
DrawGraph(pBackDC, BLUEPEN, MainWindowLeft + MAINWIDTH, MainWindowBottom);
CDC *pDC = GetDC();
if (pDC != NULL)
{
//调用OnDraw()函数,将曲线图显示在屏幕中
OnDraw(pDC);
ReleaseDC(pDC);
}
}
}
void CDrawView::WriteMessage(CDC *pBackDC, int left, int bottom, int hight )
{
CPen *OldPen = pBackDC->SelectObject(&pen[BLACKPEN]);
CString strValue;
pBackDC->SetTextAlign(TA_LEFT);
strValue.Format(" 实际值:%.2f", Data[0]);
pBackDC->TextOut(left +20, bottom - hight - 40, strValue);
}
void CDrawView::OnUpdateStop(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(Status == 1); //如果处于监测状态,Stop按扭可用
}
void CDrawView::OnUpdateStart(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(Status != 1); //如果未处于监测状态,Start按扭可用
}
void CDrawView::DrawCoordinate(CDC *pBackDC, int color, int left, int top, int right, int bottom)
{
CPen *OldPen = pBackDC->SelectObject(&pen[color]);
pBackDC->MoveTo(left, top - 20); // x,y Coordinate
pBackDC->LineTo(left, bottom);
pBackDC->LineTo(right+20, bottom);
pBackDC->MoveTo(left-5, top-10); // Arror top
pBackDC->LineTo(left, top-20);
pBackDC->LineTo(left+5, top-10);
pBackDC->MoveTo(right+10, bottom-5); // Arror right
pBackDC->LineTo(right+20, bottom);
pBackDC->LineTo(right+10, bottom+5);
// x轴刻度
for(int i=0; i<=MAINWIDTH; i++)
{
if(i % 100 == 0)
{
pBackDC->MoveTo(left+i, bottom);
pBackDC->LineTo(left+i, bottom -10);
}
else if(i % 10 == 0)
{
pBackDC->MoveTo(left+i, bottom);
pBackDC->LineTo(left+i, bottom -5);
}
}
// y轴刻度
for(i=0; i<= MAINHEIGHT; i++)
{
if( i == 200 )
{
pBackDC->SelectObject(pen[color]);
pBackDC->MoveTo(left, bottom -i );
pBackDC->LineTo(left +10, bottom -i);
}
else if(i == 100 )
{
pBackDC->SelectObject(pen[REDPEN]);
pBackDC->MoveTo(left, bottom -i );
pBackDC->LineTo(left +MAINWIDTH, bottom -i);
}
else if( (i == 50) || (i ==150))
{
pBackDC->SelectObject(pen[BLUEDOTPEN]);
pBackDC->MoveTo(left, bottom -i );
pBackDC->LineTo(left +MAINWIDTH, bottom -i);
}
else if(i % 10 == 0)
{
pBackDC->SelectObject(pen[color]);
pBackDC->MoveTo(left, bottom -i );
pBackDC->LineTo(left +5, bottom -i);
}
}
pBackDC->SelectObject(OldPen);
}
void CDrawView::WriteCoordinateX(CDC *pBackDC, int color, int left, int right, int bottom)
{
CPen *OldPen = pBackDC->SelectObject(&pen[color]);
CTime t=CTime::GetCurrentTime();
int year = t.GetYear();
int month = t.GetMonth();
int day = t.GetDay();
int hour = t.GetHour();
int minite = t.GetMinute();
int second = t.GetSecond();
int secondTemp = second;
int miniteTemp = minite;
int hourTemp = hour;
CString strTime;
pBackDC->SetTextAlign(TA_CENTER);
for(int i=0; i<=MAINWIDTH; i+= 100) // 界面显示30秒的数据
{
strTime.Format("%2d:%2d", miniteTemp, secondTemp);
pBackDC->TextOut(right - i, bottom + 15, strTime);
secondTemp -= 10; // 每10秒显示一个时间
if(secondTemp <0) // 如果秒数小于0,分数减1,秒数加60
{
miniteTemp --;
secondTemp += 60;
if(miniteTemp < 0) // 如果分数小于0,小时减1,分数加60
{
hourTemp--;
miniteTemp += 60;
}
}
}
// 在主窗口下面显示当前日期和时间
pBackDC->SetTextAlign(TA_CENTER);
strTime.Format("%4d.%2d.%2d %2d:%2d:%2d",year,month,day,hour,minite,second);
pBackDC->TextOut((left + right) / 2, bottom + 60, strTime);
pBackDC->SelectObject(OldPen);
}
void CDrawView::WriteCoordinateY(CDC *pBackDC, float max, float min, int color, int left, int bottom)
{
CPen *OldPen = pBackDC->SelectObject(&pen[color]);
CString strValue;
pBackDC->SetTextAlign(TA_RIGHT);
// Y坐标共有四个大刻度,刻度间隔是(max - min) / 2
float Delta = (max - min) / 2;
strValue.Format("%.2f", min -Delta);
pBackDC->TextOut(left - 10, bottom - 10, strValue);
strValue.Format("%.2f", min);
pBackDC->TextOut(left - 10, bottom - 60, strValue);
strValue.Format("%.2f", min + Delta);
pBackDC->TextOut(left - 10, bottom - 110, strValue);
strValue.Format("%.2f", max);
pBackDC->TextOut(left - 10, bottom - 160, strValue);
strValue.Format("%.2f", max + Delta);
pBackDC->TextOut(left - 10, bottom - 210, strValue);
pBackDC->SelectObject(OldPen);
}
void CDrawView::DrawGraph(CDC *pDC, int color, int right, int bottom)
{
CPen *OldPen = pDC->SelectObject(&pen[color]);
float ky = MAINHEIGHT / 2 / (max - min);
pDC->MoveTo(MainWindowLeft+MAINWIDTH, MainWindowBottom-50 - (int)( ( Data[0] - min ) *ky) );
for(int i=1; i<MAXDATANUMBER; i++)
{
pDC->LineTo(MainWindowLeft + MAINWIDTH-i*2, MainWindowBottom-50 - (int) ( ( Data[i] - min) *ky) );
}
pDC->SelectObject(OldPen);
}
int CDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
winx = GetSystemMetrics( SM_CXSCREEN ); // 得到屏幕宽度
winy = GetSystemMetrics( SM_CYSCREEN ); // 得到屏幕高度
pBackDC = new CDC;
CDC *pDC = GetDC(); // 获得显示DC的指针
pBackDC->CreateCompatibleDC(pDC); // 创建显示DC的兼容内存DC
//创建与显示DC的"位图"兼容的位图,位图和屏幕一样大
bmp.CreateCompatibleBitmap(pDC, winx, winy);
pBackDC->SelectObject(&bmp); //将兼容位图选进内存DC
pBackDC->SetBkColor(RGB(255,255,255)); // 设置背景为白色
pBackDC->PatBlt(0,0,winx, winy, PATCOPY); //为pBackDC创建位图
// Invalidate();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -