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