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

📄 scope.cpp

📁 通过串口读取单片机传输的电压
💻 CPP
字号:
// scope.cpp : implementation file
//

#include "stdafx.h"
#include "蓄电池充放电检测系统.h"
#include "scope.h"
#include "MemDC.h"

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

/////////////////////////////////////////////////////////////////////////////
// Cscope

Cscope::Cscope()
{
	m_penWidth=1;							//曲线高度
	m_ValueColor=RGB(255,255,0);			//曲线颜色
	m_BackColor=RGB(0,0,0);					//控件背景颜色
	m_LineColor=RGB(0,255,0);				//刻度颜色
	m_malkdColor=RGB(0,64,0);				//小刻度颜色
	m_MaxX=20;								//X最大值
	m_MaxY=5;//Y最大值
	valuejs=0;
	//fData=new float [1024];			    //数组分配内存
	//ZeroMemory (fData,sizeof(fData));     // 初始化数据为0 			
}

Cscope::~Cscope()
{
}


BEGIN_MESSAGE_MAP(Cscope, CStatic)
	//{{AFX_MSG_MAP(Cscope)
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Cscope message handlers

void Cscope::OnPaint() 
{
	// TODO: Add your message handler code here
	CPaintDC dc(this); // device context for painting
	GetClientRect(&m_controlRect);		//获得控件客户区矩形大小
	wzx=m_controlRect.left+45;
	wzy=m_controlRect.bottom-40;
	wzwith=m_controlRect.Width()-wzx;	//宽度
	wzwith=wzwith/40*40;//宽度取整
	oldx=wzx;oldy=wzy;
	if((wzwith%10)>0)wzwith=wzwith/10*10;//宽度取整
	wzright=wzy-20;//高度
	wzright=wzright/20*20;//高度取整
	//if((wzright%20>0))wzright=wzright/20*20+1;//高度取整

	CMemDC m_MemDC(&dc,&m_controlRect);// 创建内存 DC
	//绘制背景颜色边框颜色
		CPen	m_temppen;		//用来画边框的笔,颜色(m_borderColor)
		CBrush	m_tempbrush;	//用来画背景的刷子,颜色(m_backgroundcolor)
		m_temppen.CreatePen(PS_SOLID,3,m_BackColor);
		m_tempbrush.CreateSolidBrush(m_BackColor);
		CPen * pOldPen=m_MemDC.SelectObject(&m_temppen);
		CBrush * pOldBrush=m_MemDC.SelectObject(&m_tempbrush);
		m_MemDC.Rectangle(&m_controlRect);//绘制控件背景及边框
		m_MemDC.SelectObject(pOldPen);
		m_MemDC.SelectObject(pOldBrush);
		m_temppen.DeleteObject();
		m_tempbrush.DeleteObject();
		Drawkd(&m_MemDC);//画刻度
		DrawVale(&m_MemDC);//绘制曲线
	
}

void Cscope::Drawkd(CDC *pDC)//画刻度
{	
	CFont   myFont;//字体   
	myFont.CreatePointFont(90,"宋体");//目前使用的字体   
	CFont   *OldFont=pDC->SelectObject(&myFont); //设定当前字体  
	pDC->SetTextColor(m_LineColor);//文字颜色=刻度色  
	pDC->SetBkColor(m_BackColor); //文字背景色=背景色  
	pDC->SetBkMode(OPAQUE);//如用特殊文字背景色将参数改为OPAQUE  如与控件背景相同用TRANSPARENT 

	CPen m_drawNumPen,m_drawNumPen1;//定义画笔
	m_drawNumPen.CreatePen(PS_SOLID,m_penWidth,m_LineColor);
	m_drawNumPen1.CreatePen(PS_SOLID,m_penWidth,m_malkdColor);
	CPen * poldPen = (CPen *)pDC->SelectObject(&m_drawNumPen);
	
	pDC->MoveTo(wzx+1,wzy+1);
	pDC->LineTo(wzx+wzwith+1,wzy+1);//上一行到这里画横线
	pDC->MoveTo(wzx,wzy);
	pDC->LineTo(wzx,wzy-wzright);//上一行到这里画竖线
	//画X刻度
	int js=0,a;CString strtemp;
	for(a=0;a<((wzwith)/10)+1;a++)
	{	
		pDC->MoveTo(wzx+(10*a),wzy+1);
		if (a%4==0)
		{
			strtemp.Format("%2d",js*10);
			pDC->LineTo(wzx+(10*a),wzy+5);
			pDC->TextOut(wzx+(10*a)-8,wzy+12,strtemp);
			js++;
		}
		if(a%48==0)
		{	
			pDC->LineTo(wzx+(10*a),wzy+8);
		}
		pDC->LineTo(wzx+(10*a),wzy+4);	
	}
	pDC->TextOut(wzx+(10*a)-48,wzy-15,"(分钟)");
	//画Y刻度
	js=0;float aaa=3;
	for(a=0;a<((wzright)/10+1);a++)
	{	
		pDC->MoveTo(wzx-1,wzy-10*a+1);
		if (a%10==0)//画Y刻度数值
		{
			strtemp.Format("%2.2f",aaa);
			pDC->TextOut(wzx-35,wzy-10*a-4,strtemp);
			aaa+=0.5;
		}
		if (a%10==0)
		{
			pDC->LineTo(wzx-8,wzy-10*a+1);
		}
		else
		{
			pDC->LineTo(wzx-4,wzy-10*a+1);
		}
	}
	pDC->TextOut(wzx-40,wzy-10*a-10,"电压(V)");
	//画Y方向小线
	CPen * poldPen1 = (CPen *)pDC->SelectObject(&m_drawNumPen1);
	for(a=1;a<((wzwith-10)/10);a++)
	{	
		pDC->MoveTo(wzx+(40*a),wzy);
		pDC->LineTo(wzx+(40*a),wzy-wzright+1);	
	}
	//画X方向小线
	for(a=1;a<((wzright)/20+1);a++)
	{	
		pDC->MoveTo(wzx+1,wzy-(20*a)+1);
		pDC->LineTo(wzx+1+wzwith,wzy-(20*a)+1);	
	}
	pDC->SelectObject(poldPen);//恢复画笔
	m_drawNumPen.DeleteObject();//删除画笔
}
void Cscope::SetMaxKD(int x,int y)//设置XY的刻度最大值
{
	m_MaxX=x;m_MaxY=y;
	Invalidate();//刷新
}
void Cscope::DrawVale(CDC *pDC)				//画曲线
{
	float a;
	CPen m_drawNumPen;//定义画笔	
	m_drawNumPen.CreatePen(PS_SOLID,m_penWidth,m_ValueColor);
	CPen * poldPen = (CPen *)pDC->SelectObject(&m_drawNumPen);
	//初始化起点位置
	a=fData[0];
	value=(int)(a*200);
	oldx=wzx+1;oldy=wzy-value;
	//开始画线
	if(valuejs>0)
	{	
		for (int i=1;i<valuejs;i++)
		{
			a=fData[i-1];
			value=(int)(a*200);
			pDC->MoveTo(oldx,oldy);
			pDC->LineTo(wzx+i,wzy-value-1);
			oldx=wzx+i;
			oldy=wzy-value;
		}
	}				
	pDC->SelectObject(poldPen);//恢复画笔
	m_drawNumPen.DeleteObject();//删除画笔
}
void Cscope::SetBackColor(COLORREF clr)		//设置背景颜色
{
	m_BackColor=clr;
	Invalidate();//刷新
}
void Cscope::SetkdColor(COLORREF clr)		//设置刻度颜色
{
	m_LineColor=clr;
	Invalidate();//刷新
}
void Cscope::SetValueColor(COLORREF clr)	//设置曲线颜色
{
	m_ValueColor=clr;
	Invalidate();//刷新
}
void Cscope::SetmalkdColor(COLORREF clr)	//设置小刻度颜色
{
	m_malkdColor=clr;
	Invalidate();//刷新
}

void Cscope::SetVale(float xx)
{
	if(xx<0)xx=0;//防止出现负曲线
	fData[valuejs]=xx;
//	CClientDC dc(this);//获取当前控件句柄
	Invalidate();//刷新
	if(valuejs>wzwith)
	{
		valuejs=0;return;	
	}	
	valuejs++;
}		

void Cscope::OnMouseMove(UINT nFlags, CPoint point) 
{

	CStatic::OnMouseMove(nFlags, point);
}

⌨️ 快捷键说明

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