www.gusucode.com > 可用于报警信息的VC文本闪烁高亮静态类-源码程序 > 可用于报警信息的VC文本闪烁高亮静态类-源码程序\code\StaticRectangle.cpp

    //Download by http://www.NewXing.com
// StaticRectangle.cpp : implementation file
//

#include "stdafx.h" 
#include "StaticRectangle.h"
#include "MemDC.h"

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

/////////////////////////////////////////////////////////////////////////////
// CStaticRectangle

CStaticRectangle::CStaticRectangle()
{
	m_BkColor = COLOR_RED;
	m_TextColor = RGB(255,128,64);
	nMillSec  = 10;
	bGleam    = FALSE;

	m_pFnt = new CAutoFont("隶书");  
	m_pFnt->SetHeight(28);
	m_pFnt->SetWidth(12);
	m_pFnt->SetBold(TRUE); 
}

CStaticRectangle::~CStaticRectangle()
{
	if(m_pFnt)
		delete m_pFnt;
}


BEGIN_MESSAGE_MAP(CStaticRectangle, CStatic)
	//{{AFX_MSG_MAP(CStaticRectangle)
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStaticRectangle message handlers

void CStaticRectangle::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	// 获得控件区域
	GetClientRect (&m_rectCtrl);

	CMemDC memDC(&dc, &m_rectCtrl); 

	if(m_dcBackground.GetSafeHdc()== NULL|| (m_bitmapBackground.m_hObject == NULL))
	{
		m_dcBackground.CreateCompatibleDC(&dc);
		m_bitmapBackground.CreateCompatibleBitmap(&dc, m_rectCtrl.Width(), 																					m_rectCtrl.Height()) ;
		m_pBitmapOldBackground = m_dcBackground.SelectObject(&m_bitmapBackground) ;		
	}

	DrawRectangleBackground(&m_dcBackground, m_rectCtrl);
	memDC.BitBlt(0, 0, m_rectCtrl.Width(), m_rectCtrl.Height(), 
			           &m_dcBackground, 0, 0, SRCCOPY) ;
	// Do not call CStatic::OnPaint() for painting messages
}

void CStaticRectangle::DrawRectangleBackground(CDC *pDC, CRect &rect)
{
	CBrush brushFill, *pBrushOld; 
	int nXSize,nYSize;
	CSize szText;
	CFont *fOldFont;
	nXSize = rect.Width();
	nYSize = rect.Height();
	brushFill.DeleteObject();
	brushFill.CreateSolidBrush(m_BkColor);
	pBrushOld = pDC->SelectObject(&brushFill);
	pDC->Rectangle(rect);  
	pDC->SetBkColor(m_BkColor);
	pDC->SetTextColor(m_TextColor);
	fOldFont = (CFont *)pDC->SelectObject(m_pFnt);
	szText = pDC->GetTextExtent(strText);
	nXSize = (nXSize - szText.cx)/2;
	nYSize = (nYSize - szText.cy)/2;
	pDC->TextOut(nXSize,nYSize,strText);
	pDC->SelectObject(pBrushOld);
	pDC->SelectObject(&fOldFont);
	brushFill.DeleteObject();
}

void CStaticRectangle::SetRectangleText(CString strVal)
{
	this->strText = strVal;
}

void CStaticRectangle::SetBackColor(UINT nStyle)//设置背景颜色
{
	this->m_BkColor = nStyle;
}

void CStaticRectangle::SetBkGleam(BOOL bShow)
{ 
	if(this->bGleam)
	{
		if(!bShow)
			KillTimer(nMillSec);
	}
	else
	{
		if(bShow)
			SetTimer(nMillSec,750,NULL);
	}
	this->bGleam = bShow;
}

void CStaticRectangle::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(this->m_BkColor == COLOR_RED)
		this->m_BkColor = COLOR_GREEN;
	else
		this->m_BkColor = COLOR_RED;
	Invalidate();
	CStatic::OnTimer(nIDEvent);
}

BOOL CStaticRectangle::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;
}