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

📄 myscroll02.cpp

📁 51单片机测温程序
💻 CPP
字号:
// MyScroll02.cpp : implementation file
//

#include "stdafx.h"
//#include "tt.h"
#include "MyScroll02.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// MyScroll02

CMyScroll02::CMyScroll02()
{

	
	////////初始化一些数据,即默认值
	m_BkColor=RGB(0,0,0);
	m_NLColor=RGB(222,222,222);

	m_NumNetLineX=25;
	m_NumNetLineY=20;
	m_isFirst=true;
	m_isInitial=false;
	m_isShowNetLine=true;

	m_isUpdateView = false;
	m_iUpdateFreq = 25;
	m_NumberX=501;
	m_NumberY_Hig=1000;			//Y轴的正数点数!
	m_NumberY_Low=1000;			//Y轴的负数点数
	m_NumberY = m_NumberY_Hig+m_NumberY_Low;
	m_SColor=RGB(255,0,0);
	for(int i=0;i<m_NumberX;i++)
	{
		m_pMapPoint[i].x=0;
		m_pMapPoint[i].y=0;
	}
	m_nBeginMapPoint=0;
}

CMyScroll02::~CMyScroll02()
{

	pDC=NULL;
	pDC_B = NULL;

}


BEGIN_MESSAGE_MAP(CMyScroll02, CStatic)
	//{{AFX_MSG_MAP(CMyScroll02)
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// MyScroll02 message handlers
void CMyScroll02::InitDrawBk()
{
	m_isInitial = true;
	PrepareDC();
	BeginDrawBk();
}
void CMyScroll02::PrepareDC()
{
	CRect rt;
	GetClientRect(&rt);

	pDC_B=GetDC();					//////最好记得在最后析构函数中把它给释放了

	pDC_B->SetMapMode(MM_ANISOTROPIC);
	pDC_B->SetWindowExt(1000,m_NumberY);//////设置逻辑坐标系的X,Y轴的点数
	pDC_B->SetViewportExt(rt.right,rt.bottom);
	pDC_B->SetWindowOrg(0,-m_NumberY_Hig);////////把逻辑坐标的原点设为左边的中间点

	pDC=GetDC();					//////最好记得在最后析构函数中把它给释放了

	pDC->SetMapMode(MM_ANISOTROPIC);
	pDC->SetWindowExt(1000,m_NumberY);//////设置逻辑坐标系的X,Y轴的点数
	pDC->SetViewportExt(rt.right,rt.bottom);
	pDC->SetWindowOrg(0,-m_NumberY_Hig);////////把逻辑坐标的原点设为左边的中间点
	
	
//	GetMonitorFrequency();
//	SetTimer(2,m_iUpdateFreq,0);
}
/////////////////////////////////////////////////////////////////////////////
//////设置CDC 设备的属性
void CMyScroll02::OnPrepareDC(CDC *dc)
{
	CRect rt;
	GetClientRect(&rt);

	dc->SetMapMode(MM_ANISOTROPIC);
	dc->SetWindowExt(1000,m_NumberY);//////设置逻辑坐标系的X,Y轴的点数
	dc->SetViewportExt(rt.right,rt.bottom);
	dc->SetWindowOrg(0,-m_NumberY_Hig);////////把逻辑坐标的原点设为左边的中间点
}
/////////////////////////////////////////////////////////////////////////////
//////画背景的,单画背景,而不画曲线;而且直接在视图当中画
void CMyScroll02::BeginDrawBk()
{
	if(m_isInitial)
	{
		CBrush   m_BkBrush(m_BkColor);/////画背景用的BRUSH
		CRect rt;
		GetClientRect(&rt);
		CBrush *OldBrush=pDC_B->SelectObject(&m_BkBrush);
		pDC_B->Rectangle(CRect(0,-m_NumberY_Hig,1000,m_NumberY_Low));

		if(m_isShowNetLine)
			DrawBkLine();

		pDC_B->SelectObject(OldBrush);
	}
}

/////////////////////////////////////////////////////////////////////////////
////////画背景网格线的,而不画曲线;而且直接在视图当中画
void CMyScroll02::DrawBkLine()
{
	CPen hp1(PS_SOLID,5,RGB(11,11,11));///////用于画主线的
	CPen hp2(PS_SOLID,1,m_NLColor);///////// 用于画其它网格线的

	CPen *OldPen=pDC_B->SelectObject(&hp1);
	pDC_B->MoveTo(0,0);
	pDC_B->LineTo(1000,0);

	pDC_B->SelectObject(&hp2);
	int GradX,GradY;
	GradX=1000/m_NumNetLineX;
	GradY=m_NumberY/m_NumNetLineY;
	////////////////////////////////////////////画网格线
	for(int i=0;i<m_NumNetLineX;i++)
	{//////////////////画竖线
 		pDC_B->MoveTo(i*GradX,-m_NumberY_Hig);
		pDC_B->LineTo(i*GradX,m_NumberY_Low);
	}
	//////////////////画横线
	for(int j=0;j<m_NumNetLineY;j++)
	{
		if((m_NumberY_Low-j*GradY)!=0)
		{
			pDC_B->MoveTo(0,m_NumberY_Low-j*GradY);
			pDC_B->LineTo(1000,m_NumberY_Low-j*GradY);
		}
	}
	pDC_B->SelectObject(OldPen);
}
////////////////////////////////////////////////////////////////////////////////////
//////////////设新加的点的Y轴的坐标
void CMyScroll02::SetScrollPoint(int y)
{
	m_nBeginMapPoint++;	

	if(y>m_NumberY_Hig||y<-m_NumberY_Low)
	{
		m_pMapPoint[m_nBeginMapPoint%m_NumberX].y=m_pMapPoint[(m_nBeginMapPoint-1)%m_NumberX].y;
	}
	else
	{
		m_pMapPoint[m_nBeginMapPoint%m_NumberX].y=-1*y;
	}
	if(m_isFirst)
	{
			m_pMapPoint[m_nBeginMapPoint].x=m_nBeginMapPoint*1000/m_NumberX;
	
		if(m_nBeginMapPoint>=(m_NumberX))
			m_isFirst=false;
	}
	else
	{
			for(int j=0;j<m_NumberX;j++)
			{
				m_pMapPoint[(m_nBeginMapPoint+j+1)%m_NumberX].x=j*1000/m_NumberX;
			}
	}
//	DrawScroll();
}
////////////////////////////////////////////////////////////////////////////////////
//////////////画曲线
void CMyScroll02::DrawScroll()
{
	int j;
	CDC dc;
	CBitmap bitmap;
	CPen *OldPen;//=pDC->SelectObject(&hp3);
	
	CBitmap* pOldBitmap; 
	CRect client; 
	CRect rect; 
	pDC->GetClipBox(client);//检取无效区 
	GetClientRect(rect);//检取整个客户区 
	if(dc.CreateCompatibleDC(pDC))//创建一个与pDC兼容的内存设备环境 
	{ 
		if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height()))//创建一与pDC兼容的位图,大小为整个客户区 
		{ 
			OnPrepareDC(&dc);//使dc与pDC具有同样的映射关系 
			pOldBitmap=dc.SelectObject(&bitmap);//将位图选入内存环境 
			dc.SelectClipRgn(NULL);//使dc的整个客户区都成无效区 
			dc.IntersectClipRect(client);//再“与上”检取的无效区,使 
			//内存环境与pDC检取的无效区相等 
		} 
	} 
	//将所有的画图对象在内存裁减区内重画 
	CBrush brush; 
	if(!brush.CreateSolidBrush(m_BkColor)) 
		return ; 
	brush.UnrealizeObject(); 
	dc.FillRect(client,&brush);//将dc的作图区刷新成背景色 
	if(m_isShowNetLine)
	{											//是否绘制网络线
		CPen hp1(PS_SOLID,5,RGB(11,11,11));///////用于画主线的
		CPen hp2(PS_SOLID,1,m_NLColor);///////// 用于画其它网格线的
	
		CPen *OldPen=dc.SelectObject(&hp1);
		dc.MoveTo(0,0);
		dc.LineTo(1000,0);	

		dc.SelectObject(&hp2);
		int GradX,GradY;
		GradX=1000/m_NumNetLineX;
		GradY=m_NumberY/m_NumNetLineY;
		////////////////////////////////////////////画网格线
		for(int i=0;i<m_NumNetLineX;i++)
		{//////////////////画竖线
			dc.MoveTo(i*GradX,-m_NumberY_Hig);
			dc.LineTo(i*GradX,m_NumberY_Low);
		}
		//////////////////画横线
		for(j=0;j<m_NumNetLineY;j++)
		{
			if((m_NumberY_Low-j*GradY)!=0)
			{
				dc.MoveTo(0,(m_NumberY_Low-j*GradY));
				dc.LineTo(1000,(m_NumberY_Low-j*GradY));
			}
		}
	}
	// TODO: Add your message handler code here//以下代码为画曲线的
	//////////////////////////////先判断是否是第一帧
	if(m_isFirst)
	{
		CPen hp3;
		hp3.CreatePen(PS_SOLID,2,m_SColor);
		OldPen=dc.SelectObject(&hp3);

		dc.MoveTo(0,0);
		for(j=0;j<=m_nBeginMapPoint;j++)
		{
			dc.LineTo(m_pMapPoint[j]);
		}
		dc.SelectObject(OldPen);
	}
	else
	{
		CPen hp3;
		hp3.CreatePen(PS_SOLID,2,m_SColor);
		OldPen=dc.SelectObject(&hp3);
		dc.MoveTo(m_pMapPoint[(m_nBeginMapPoint+1)%m_NumberX]);
		for(int i=1;i<=m_NumberX;i++)
		{
			dc.LineTo(m_pMapPoint[(m_nBeginMapPoint+i)%m_NumberX]);
		}
		dc.SelectObject(OldPen);
	}
	pDC->BitBlt(client.left,client.top,client.Width(),client.Height(), 
				&dc,client.left,client.top,SRCCOPY);//将内存裁减区的位图 
				//拷贝到窗口裁减区 
	dc.SelectObject(pOldBitmap); 
}
/////////////////////////////////////////////////////////////////////////////////////////
//////////////////以下函数用于显示的设置
/////////////////////////////////////////////////////////////////
////////设置背景颜色的
void CMyScroll02::SetBkMapColor(COLORREF BkColor)
{
	m_BkColor=BkColor;
	BeginDrawBk();
}
//////////////////////////////////////////////////////////////////
//////////设置网格线数目
void CMyScroll02::SetNetLine(int x,int y)
{
	m_NumNetLineX=x;
	m_NumNetLineY=y;
	BeginDrawBk();
}
///////////////////////////////////////////////////////////////////
//////////设置各路曲线的颜色的
void CMyScroll02::SetScrollColor(COLORREF ScrollColor)
{
//	if(ScrollID<=8&&ScrollID>0)
		m_SColor=ScrollColor;
//	else
//		AfxMessageBox("The ScrollID error!!!!");
}
////////////////////////////////////////////////////////////////////
////////////设置网络线的颜色
void CMyScroll02::SetNetLineColor(COLORREF LineColor)
{
	m_NLColor=LineColor;
	BeginDrawBk();
}
void CMyScroll02::SetNumberX(int x)
{
	m_NumberX=x;
}
//////////////////////////////////////////////////////////////////////
////////////设置是否显示网络线
void CMyScroll02::IsShowNetLine(BOOL isShowNetLine)
{
	m_isShowNetLine=isShowNetLine;
	BeginDrawBk();
}
//////////////////////////////////////////////////////////////////////
////////////设置是否允许刷新显示
void CMyScroll02::SetUpdateFlag(BOOL BTemp)
{
	m_isUpdateView=BTemp;
	//BeginDrawBk();
	if(m_isUpdateView)
	{
		SetTimer(2,m_iUpdateFreq,0);
	}
	else
	{
		KillTimer(2);
	}
}
/////////////////////////////////////////////////////////////////////////////
//重设置Y轴的坐标点数!
void CMyScroll02::SetNumberY(int Y_Hig,int Y_Low)
{
	m_NumberY_Hig = Y_Hig;
	m_NumberY_Low = Y_Low;
	m_NumberY = m_NumberY_Hig+m_NumberY_Low;
	BeginDrawBk();
}
/////////////////////////////////////////////////////////////////////////////
// CMyScroll02 message handlers

void CMyScroll02::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
//	DrawScroll();

	// Do not call CStatic::OnPaint() for painting messages
}

void CMyScroll02::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	if(nIDEvent==2) DrawScroll();

	CStatic::OnTimer(nIDEvent);
}



BOOL CMyScroll02::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	DrawScroll();
	return CStatic::OnEraseBkgnd(pDC);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -