📄 scope.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 + -