www.gusucode.com > 一个VC++ GUI测试程序-源码程序 > 一个VC++ GUI测试程序-源码程序/code/StaticFader.cpp

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

#include "stdafx.h"
#include "StaticFader.h"

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

#define TIMERINTERVAL 10

/////////////////////////////////////////////////////////////////////////////
// CStaticFader

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
CStaticFader::CStaticFader()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
	// Set defaults:

	m_uAlignFlag = DT_CENTER;
	m_bDrawBorder = true;
	m_bDrawShadow=false;
	m_crBackground = RGB(210,210,210);
	m_crSubText = RGB(0,0,60);
	m_crMainText = RGB(0,0,60);

	m_strSubText = m_strMainText = "";

	m_pSubFont = new CAutoFont("Arial");
	m_pMainFont = new CAutoFont("Arial");
	
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
CStaticFader::~CStaticFader()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
}


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

/////////////////////////////////////////////////////////////////////////////
// CStaticFader message handlers

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void CStaticFader::OnTimer(UINT nIDEvent) 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
	if ( (GetTickCount()-m_dwStopwatch) > 1000)	KillTimer(500);

	Invalidate(FALSE);
	
	CStatic::OnTimer(nIDEvent);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void CStaticFader::Display(CString strText, CString strSubText, int nFadePercent, bool bResetColours, CString strSubFont, CString strMainFont)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
	if (!strMainFont.IsEmpty())		m_pMainFont->ExtractFont(strMainFont);
	if (!strSubFont.IsEmpty())		m_pSubFont->ExtractFont(strSubFont);

	if (bResetColours)
	{
		m_crBackground = RGB(210,210,210);
		m_crSubText = RGB(0,0,60);
		m_crMainText = RGB(0,0,60);
	}

	m_strMainText = strText;
	m_strSubText = strSubText;
	m_nFadePercent = nFadePercent;
	m_dwStopwatch = GetTickCount();
	SetTimer(500, TIMERINTERVAL, NULL);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void CStaticFader::OnPaint() 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
	CPaintDC dc(this); // device context for painting
	CMemDC memDC(&dc, m_rectClient);
	CMemDC* pDC = &memDC;
	GetClientRect(&m_rectClient);

	pDC->SetBkMode(TRANSPARENT);

	if ( m_strSubText.IsEmpty() )
	{
		pDC->FillSolidRect( m_rectClient.left, m_rectClient.top, m_rectClient.right, m_rectClient.bottom, m_crBackground );
		
		if (m_bDrawBorder)	
			pDC->Draw3dRect( m_rectClient.left, m_rectClient.top, m_rectClient.right, m_rectClient.bottom, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT) );
	}
	else
	{
		pDC->FillSolidRect( m_rectClient.left, m_rectClient.top, m_rectClient.left+49, m_rectClient.bottom, m_crBackground );

		if (m_bDrawBorder)	
			pDC->Draw3dRect( m_rectClient.left, m_rectClient.top, m_rectClient.left+49, m_rectClient.bottom, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT) );

		pDC->FillSolidRect( m_rectClient.left+50, m_rectClient.top, m_rectClient.right-50, m_rectClient.bottom, m_crBackground);
		
		if (m_bDrawBorder)	
			pDC->Draw3dRect( m_rectClient.left+50, m_rectClient.top, m_rectClient.right-50, m_rectClient.bottom, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT) );
	}

    DrawText(pDC);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void CStaticFader::DrawText(CMemDC *pDC)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
	CFont *pOldFont = NULL;
	
	if ( ! m_strSubText.IsEmpty())
	{
	    pOldFont=pDC->SelectObject(m_pSubFont);
		CRect rect = m_rectClient;
		rect.right=50;
		pDC->SetTextColor( GetCurrentColour( m_crSubText ) );
		int x = pDC->DrawText((LPCTSTR)m_strSubText,m_strSubText.GetLength(),&rect, DT_CENTER| DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER );
		pDC->SelectObject(pOldFont);
	}

	if ( ! m_strMainText.IsEmpty())
	{
	    pOldFont=pDC->SelectObject(m_pMainFont);
		CRect rect = m_rectClient;
		rect.right-=1;
		
		if ( ! m_strSubText.IsEmpty())	rect.left+=50;

		// If required draw text with darker colour to appear as a shadow

		if (m_bDrawShadow)
		{
			CRect shadowrect = rect;
			shadowrect.top+=2;
			shadowrect.left+=2;

			int r = GetRValue(m_crBackground);	
			int g = GetGValue(m_crBackground);	
			int b = GetBValue(m_crBackground);

			if ( (r-=50)<0 ) r = 0;	
			if ( (g-=50)<0 ) g = 0;		
			if ( (b-=50)<0 ) b = 0;
			
			pDC->SetTextColor( GetCurrentColour( RGB(r,g,b) ) );
			pDC->DrawText((LPCTSTR)m_strMainText, m_strMainText.GetLength(),&shadowrect, m_uAlignFlag | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER );
		}

		pDC->SetTextColor( GetCurrentColour( m_crMainText ) );
		pDC->DrawText((LPCTSTR)m_strMainText, m_strMainText.GetLength(),&rect, m_uAlignFlag | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER );
		pDC->SelectObject(pOldFont);
	}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
COLORREF CStaticFader::GetCurrentColour(COLORREF crText)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
	UINT uCurrentPercent = (UINT) (GetTickCount() - m_dwStopwatch)/10;
	
	if ( uCurrentPercent >= (UINT)m_nFadePercent) return crText;

	short Back_r = GetRValue(m_crBackground);
	short Back_g = GetGValue(m_crBackground);
	short Back_b = GetBValue(m_crBackground);

	short Target_r = GetRValue(crText);
	short Target_g = GetGValue(crText);
	short Target_b = GetBValue(crText);

	short Diff_r = Back_r - Target_r;
	short Diff_g = Back_g - Target_g;
	short Diff_b = Back_b - Target_b;

	short Current_r = Back_r - (short) (((float)Diff_r/(float)m_nFadePercent)*uCurrentPercent);
	short Current_g = Back_g - (short) (((float)Diff_g/(float)m_nFadePercent)*uCurrentPercent);
	short Current_b = Back_b - (short) (((float)Diff_b/(float)m_nFadePercent)*uCurrentPercent);

	return RGB( Current_r, Current_g, Current_b );
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void CStaticFader::Initialise(COLORREF crBG, COLORREF crMainText, COLORREF crSubText)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
	m_crBackground = crBG;
	m_crMainText = crMainText;
	m_crSubText = crSubText;
}