?? 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()
{
////////初始化一些數(shù)據(jù),即默認(rèn)值
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軸的正數(shù)點(diǎn)數(shù)!
m_NumberY_Low=1000; //Y軸的負(fù)數(shù)點(diǎn)數(shù)
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(); //////最好記得在最后析構(gòu)函數(shù)中把它給釋放了
pDC_B->SetMapMode(MM_ANISOTROPIC);
pDC_B->SetWindowExt(1000,m_NumberY);//////設(shè)置邏輯坐標(biāo)系的X,Y軸的點(diǎn)數(shù)
pDC_B->SetViewportExt(rt.right,rt.bottom);
pDC_B->SetWindowOrg(0,-m_NumberY_Hig);////////把邏輯坐標(biāo)的原點(diǎn)設(shè)為左邊的中間點(diǎn)
pDC=GetDC(); //////最好記得在最后析構(gòu)函數(shù)中把它給釋放了
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1000,m_NumberY);//////設(shè)置邏輯坐標(biāo)系的X,Y軸的點(diǎn)數(shù)
pDC->SetViewportExt(rt.right,rt.bottom);
pDC->SetWindowOrg(0,-m_NumberY_Hig);////////把邏輯坐標(biāo)的原點(diǎn)設(shè)為左邊的中間點(diǎn)
// GetMonitorFrequency();
// SetTimer(2,m_iUpdateFreq,0);
}
/////////////////////////////////////////////////////////////////////////////
//////設(shè)置CDC 設(shè)備的屬性
void CMyScroll02::OnPrepareDC(CDC *dc)
{
CRect rt;
GetClientRect(&rt);
dc->SetMapMode(MM_ANISOTROPIC);
dc->SetWindowExt(1000,m_NumberY);//////設(shè)置邏輯坐標(biāo)系的X,Y軸的點(diǎn)數(shù)
dc->SetViewportExt(rt.right,rt.bottom);
dc->SetWindowOrg(0,-m_NumberY_Hig);////////把邏輯坐標(biāo)的原點(diǎn)設(shè)為左邊的中間點(diǎn)
}
/////////////////////////////////////////////////////////////////////////////
//////畫背景的,單畫背景,而不畫曲線;而且直接在視圖當(dāng)中畫
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);
}
}
/////////////////////////////////////////////////////////////////////////////
////////畫背景網(wǎng)格線的,而不畫曲線;而且直接在視圖當(dāng)中畫
void CMyScroll02::DrawBkLine()
{
CPen hp1(PS_SOLID,5,RGB(11,11,11));///////用于畫主線的
CPen hp2(PS_SOLID,1,m_NLColor);///////// 用于畫其它網(wǎng)格線的
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;
////////////////////////////////////////////畫網(wǎng)格線
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);
}
////////////////////////////////////////////////////////////////////////////////////
//////////////設(shè)新加的點(diǎn)的Y軸的坐標(biāo)
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;
}
{
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);//檢取無效區(qū)
GetClientRect(rect);//檢取整個(gè)客戶區(qū)
if(dc.CreateCompatibleDC(pDC))//創(chuàng)建一個(gè)與pDC兼容的內(nèi)存設(shè)備環(huán)境
{
if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height()))//創(chuàng)建一與pDC兼容的位圖,大小為整個(gè)客戶區(qū)
{
OnPrepareDC(&dc);//使dc與pDC具有同樣的映射關(guān)系
pOldBitmap=dc.SelectObject(&bitmap);//將位圖選入內(nèi)存環(huán)境
dc.SelectClipRgn(NULL);//使dc的整個(gè)客戶區(qū)都成無效區(qū)
dc.IntersectClipRect(client);//再“與上”檢取的無效區(qū),使
//內(nèi)存環(huán)境與pDC檢取的無效區(qū)相等
}
}
//將所有的畫圖對象在內(nèi)存裁減區(qū)內(nèi)重畫
CBrush brush;
if(!brush.CreateSolidBrush(m_BkColor))
return ;
brush.UnrealizeObject();
dc.FillRect(client,&brush);//將dc的作圖區(qū)刷新成背景色
if(m_isShowNetLine)
{ //是否繪制網(wǎng)絡(luò)線
CPen hp1(PS_SOLID,5,RGB(11,11,11));///////用于畫主線的
CPen hp2(PS_SOLID,1,m_NLColor);///////// 用于畫其它網(wǎng)格線的
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;
////////////////////////////////////////////畫網(wǎng)格線
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);//將內(nèi)存裁減區(qū)的位圖
//拷貝到窗口裁減區(qū)
dc.SelectObject(pOldBitmap);
}
/////////////////////////////////////////////////////////////////////////////////////////
//////////////////以下函數(shù)用于顯示的設(shè)置
/////////////////////////////////////////////////////////////////
////////設(shè)置背景顏色的
void CMyScroll02::SetBkMapColor(COLORREF BkColor)
{
m_BkColor=BkColor;
BeginDrawBk();
}
//////////////////////////////////////////////////////////////////
//////////設(shè)置網(wǎng)格線數(shù)目
void CMyScroll02::SetNetLine(int x,int y)
{
m_NumNetLineX=x;
m_NumNetLineY=y;
BeginDrawBk();
}
///////////////////////////////////////////////////////////////////
//////////設(shè)置各路曲線的顏色的
void CMyScroll02::SetScrollColor(COLORREF ScrollColor)
{
// if(ScrollID<=8&&ScrollID>0)
m_SColor=ScrollColor;
// else
// AfxMessageBox("The ScrollID error!!!!");
}
////////////////////////////////////////////////////////////////////
////////////設(shè)置網(wǎng)絡(luò)線的顏色
void CMyScroll02::SetNetLineColor(COLORREF LineColor)
{
m_NLColor=LineColor;
BeginDrawBk();
}
void CMyScroll02::SetNumberX(int x)
{
m_NumberX=x;
}
//////////////////////////////////////////////////////////////////////
////////////設(shè)置是否顯示網(wǎng)絡(luò)線
void CMyScroll02::IsShowNetLine(BOOL isShowNetLine)
{
m_isShowNetLine=isShowNetLine;
BeginDrawBk();
}
//////////////////////////////////////////////////////////////////////
////////////設(shè)置是否允許刷新顯示
void CMyScroll02::SetUpdateFlag(BOOL BTemp)
{
m_isUpdateView=BTemp;
//BeginDrawBk();
if(m_isUpdateView)
{
SetTimer(2,m_iUpdateFreq,0);
}
else
{
KillTimer(2);
}
}
/////////////////////////////////////////////////////////////////////////////
//重設(shè)置Y軸的坐標(biāo)點(diǎn)數(shù)!
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -