www.pudn.com > ElectronicAlbums.rar > DataDispaly.cpp


// DataDispaly.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "DataDispaly.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDataDispaly 
 
CDataDispaly::CDataDispaly() 
{ 
	m_CurPos = 0; 
	m_DataStep = DATA_STEP_LEN; 
	m_PrePoint.x = 0; 
	m_PrePoint.y = 0; 
} 
 
CDataDispaly::~CDataDispaly() 
{ 
 
	if(m_BkDC.GetSafeHdc() != NULL) 
	{ 
		m_BkDC.DeleteDC(); 
	} 
 
    if(m_TempDC.GetSafeHdc() != NULL) 
	{ 
		m_TempDC.DeleteDC(); 
	} 
} 
 
 
BEGIN_MESSAGE_MAP(CDataDispaly, CStatic) 
	//{{AFX_MSG_MAP(CDataDispaly) 
	ON_WM_PAINT() 
	ON_WM_NCHITTEST() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDataDispaly message handlers 
 
BOOL CDataDispaly::Create(DWORD dwStyle, CRect &rect, CWnd *pParent, UINT id) 
{ 
	BOOL result ; 
	result =  CStatic::Create(NULL, dwStyle, rect, pParent, id); 
 
	m_rcClient.left = 0; 
	m_rcClient.top =  0; 
	m_rcClient.right = rect.Width(); 
	m_rcClient.bottom = rect.Height() ; 
 
	InitParam(); 
	InitUserDC(); 
 
	return result; 
 
} 
 
void CDataDispaly::InitParam() 
{ 
	m_clrBkGround = RGB(0,0,0); 
	m_clrGrid = RGB(0,70,0); 
	m_clrDate = RGB(0,255,0); 
	m_iInterval = 10; 
} 
 
void CDataDispaly::InitUserDC() 
{ 
	CPaintDC dc(this); 
 
	if(m_BkDC.GetSafeHdc() == NULL)  
	{ 
		m_BkDC.CreateCompatibleDC(&dc); 
		m_BkBitmap.CreateCompatibleBitmap(&dc, m_rcClient.Width(), m_rcClient.Height()); 
		m_BkDC.SelectObject(&m_BkBitmap); 
	} 
 
	if(m_TempDC.GetSafeHdc() == NULL)  
	{ 
		m_TempDC.CreateCompatibleDC(&dc); 
		m_TempBitmap.CreateCompatibleBitmap(&dc, m_rcClient.Width(), m_rcClient.Height()); 
		m_TempDC.SelectObject(&m_TempBitmap); 
	} 
	DrawGrid(&m_BkDC); 
	m_TempDC.BitBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), &m_BkDC, 0, 0, SRCCOPY); 
} 
 
void CDataDispaly::ResoreBK() 
{ 
	DrawGrid(&m_BkDC); 
	m_TempDC.BitBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), &m_BkDC, 0, 0, SRCCOPY); 
	Invalidate(); 
 
	m_CurPos = 0; 
	m_DataStep = DATA_STEP_LEN; 
	m_PrePoint.x = 0; 
	m_PrePoint.y = 0; 
	 
} 
void CDataDispaly::DrawGrid(CDC *pDC) 
{ 
	int i, j, x, y; 
 
	x = m_rcClient.Height() / m_iInterval; 
	y = m_rcClient.Width() / m_iInterval; 
 
	DrawBackGruond(pDC); 
 
	CPen  pen; 
	CPen* oldpen; 
	pen.CreatePen(PS_SOLID, 1, m_clrGrid);	    
	oldpen=pDC->SelectObject(&pen); 
 
	pDC->MoveTo(m_rcClient.left,	m_rcClient.top); 
	pDC->LineTo(m_rcClient.right,	m_rcClient.top); 
	pDC->LineTo(m_rcClient.right,	m_rcClient.bottom-1); 
	pDC->LineTo(m_rcClient.left,	m_rcClient.bottom-1); 
	pDC->LineTo(m_rcClient.left,	m_rcClient.top); 
 
	for(i = 1; i < x+1; i++) 
	{ 
		pDC->MoveTo(0, m_iInterval * i); 
		pDC->LineTo(m_rcClient.Width(), m_iInterval * i); 
	} 
	for(j = 1; j < y+1; j++) 
	{ 
		pDC->MoveTo(m_iInterval * j, 0); 
		pDC->LineTo(m_iInterval * j, m_rcClient.Height()); 
	} 
 
	pDC->SelectObject(oldpen); 
	pen.DeleteObject(); 
} 
 
void CDataDispaly::DrawBackGruond(CDC *pDC) 
{ 
	pDC->FillSolidRect(m_rcClient,m_clrBkGround); 
} 
 
 
void CDataDispaly::DrawData(int* pData) 
{ 
	CPen  pen, penMid; 
	CPen* oldpen; 
	pen.CreatePen(PS_SOLID, 1, m_clrDate);	   
	penMid.CreatePen(PS_SOLID, 1, RGB(255,0,0));	 
	oldpen=m_TempDC.SelectObject(&pen); 
 
	m_TempDC.MoveTo(m_PrePoint); 
	m_TempDC.BitBlt(m_CurPos, 0, m_DataStep, m_rcClient.Height(), &m_BkDC, m_CurPos, 0, SRCCOPY); 
	//»­ÐÂÏß 
	for(int i = 0; i < m_DataStep; i++) 
	{ 
		m_TempDC.LineTo(m_CurPos + i, (int)(pData[i])); 
	} 
	//»­É¨ÃèÏß 
	m_TempDC.SelectObject(&oldpen); 
	oldpen = m_TempDC.SelectObject(&penMid); 
	m_TempDC.MoveTo(m_CurPos + m_DataStep, 0); 
	m_TempDC.LineTo(m_CurPos + m_DataStep, m_rcClient.Height()); 
 
	m_CurPos += m_DataStep; 
	m_PrePoint.x = m_CurPos -1; 
	 
	if (m_CurPos  > m_rcClient.Width() + 1) 
	{ 
		m_CurPos = 0; 
		m_PrePoint.x = 0; 
	} 
	i --; 
	m_PrePoint.y = pData[i]; 
 
	m_TempDC.SelectObject(oldpen); 
	pen.DeleteObject(); 
	penMid.DeleteObject(); 
 
	Invalidate(); 
} 
 
void CDataDispaly::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
	dc.BitBlt(0,0,m_rcClient.Width(),m_rcClient.Height(),&m_TempDC,0,0,SRCCOPY); 
	// Do not call CStatic::OnPaint() for painting messages 
} 
 
void CDataDispaly::SetDataColor(COLORREF dataColor) 
{ 
	m_clrDate = dataColor; 
} 
 
UINT CDataDispaly::OnNcHitTest(CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	 
	return CStatic::OnNcHitTest(point); 
}