⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawview.cpp

📁 文档和视 内容摘要: 1.通过文档类与用户交互 2.通过视类与用户交互 含有相关的课件和源码例子说明,适用于VC初学者
💻 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 + -