StaticFader.cpp
上传用户:guanx8y8
上传日期:2007-07-30
资源大小:326k
文件大小:9k
开发平台:

Visual C++

  1. // StaticFader.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "StaticFader.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. #define TIMERINTERVAL 10
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CStaticFader
  13. BEGIN_MESSAGE_MAP(CStaticFader, CStatic)
  14. //{{AFX_MSG_MAP(CStaticFader)
  15. ON_WM_TIMER()
  16. ON_WM_PAINT()
  17. //}}AFX_MSG_MAP
  18. END_MESSAGE_MAP()
  19. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  20. CStaticFader::CStaticFader()
  21. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  22. {
  23. // Set defaults:
  24. m_uAlignFlag = DT_LEFT;
  25. m_bDrawBorder = false;
  26. m_bDrawShadow=false;
  27. m_crBackground = RGB(210,210,210);
  28. m_crSubText = RGB(0,0,60);
  29. m_crMainText = RGB(0,0,60);
  30. m_strSubText = m_strMainText = "";
  31. m_pSubFont = new CAutoFont("Arial");
  32. m_pMainFont = new CAutoFont("Arial");
  33. }
  34. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  35. CStaticFader::~CStaticFader()
  36. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. {
  38. if(m_pMainFont!=NULL)
  39. delete m_pMainFont;
  40. if(m_pSubFont!=NULL)
  41. delete m_pSubFont;
  42. }
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CStaticFader message handlers
  45. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  46. void CStaticFader::OnTimer(UINT nIDEvent) 
  47. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. {
  49. if ( (GetTickCount()-m_dwStopwatch) > 1000) KillTimer(500);
  50. Invalidate(FALSE);
  51. CStatic::OnTimer(nIDEvent);
  52. }
  53. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  54. void CStaticFader::Display(CString strText, CString strSubText, int nFadePercent, bool bResetColours, CString strSubFont, CString strMainFont)
  55. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. {
  57. if (!strMainFont.IsEmpty()) m_pMainFont->ExtractFont(strMainFont);
  58. if (!strSubFont.IsEmpty()) m_pSubFont->ExtractFont(strSubFont);
  59. if (bResetColours)
  60. {
  61. m_crBackground = RGB(210,210,210);
  62. m_crSubText = RGB(0,0,60);
  63. m_crMainText = RGB(0,0,60);
  64. }
  65. m_strMainText = strText;
  66. m_strSubText = strSubText;
  67. m_nFadePercent = nFadePercent;
  68. m_dwStopwatch = GetTickCount();
  69. SetTimer(500, TIMERINTERVAL, NULL);
  70. }
  71. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  72. void CStaticFader::OnPaint() 
  73. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. {
  75. CPaintDC dc(this); // device context for painting
  76. dc.SetBkMode(TRANSPARENT);
  77. CMemDC memDC(&dc, &m_rectClient);
  78. CMemDC* pDC = &memDC;
  79. GetClientRect(&m_rectClient);
  80. pDC->SetBkMode(TRANSPARENT);
  81. if ( m_strSubText.IsEmpty() )
  82. {
  83. pDC->FillSolidRect( m_rectClient.left, m_rectClient.top, m_rectClient.right, m_rectClient.bottom, m_crBackground );
  84. if (m_bDrawBorder)
  85. pDC->Draw3dRect( m_rectClient.left, m_rectClient.top, m_rectClient.right, m_rectClient.bottom, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT) );
  86. }
  87. else
  88. {
  89. pDC->FillSolidRect( m_rectClient.left, m_rectClient.top, m_rectClient.left+49, m_rectClient.bottom, m_crBackground );
  90. if (m_bDrawBorder)
  91. pDC->Draw3dRect( m_rectClient.left, m_rectClient.top, m_rectClient.left+49, m_rectClient.bottom, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT) );
  92. pDC->FillSolidRect( m_rectClient.left+50, m_rectClient.top, m_rectClient.right-50, m_rectClient.bottom, m_crBackground);
  93. if (m_bDrawBorder)
  94. pDC->Draw3dRect( m_rectClient.left+50, m_rectClient.top, m_rectClient.right-50, m_rectClient.bottom, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT) );
  95. }
  96. DrawText(pDC);
  97. pDC=NULL;
  98. }
  99. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  100. void CStaticFader::DrawText(CMemDC *pDC)
  101. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. {
  103. CFont *pOldFont = NULL;
  104. if ( ! m_strSubText.IsEmpty())
  105. {
  106.     pOldFont=pDC->SelectObject(m_pSubFont);
  107. CRect rect = m_rectClient;
  108. rect.right=50;
  109. pDC->SetTextColor( GetCurrentColour( m_crSubText ) );
  110. int x = pDC->DrawText((LPCTSTR)m_strSubText,m_strSubText.GetLength(),&rect, DT_CENTER| DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER );
  111. pDC->SelectObject(pOldFont);
  112. }
  113. if ( ! m_strMainText.IsEmpty())
  114. {
  115.     pOldFont=pDC->SelectObject(m_pMainFont);
  116. CRect rect = m_rectClient;
  117. rect.right-=1;
  118. if ( ! m_strSubText.IsEmpty()) rect.left+=50;
  119. // If required draw text with darker colour to appear as a shadow
  120. if (m_bDrawShadow)
  121. {
  122. CRect shadowrect = rect;
  123. shadowrect.top+=2;
  124. shadowrect.left+=2;
  125. int r = GetRValue(m_crBackground);
  126. int g = GetGValue(m_crBackground);
  127. int b = GetBValue(m_crBackground);
  128. if ( (r-=50)<0 ) r = 0;
  129. if ( (g-=50)<0 ) g = 0;
  130. if ( (b-=50)<0 ) b = 0;
  131. pDC->SetTextColor( GetCurrentColour( RGB(r,g,b) ) );
  132. pDC->DrawText((LPCTSTR)m_strMainText, m_strMainText.GetLength(),&shadowrect, m_uAlignFlag | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER );
  133. }
  134. pDC->SetTextColor( GetCurrentColour( m_crMainText ) );
  135. pDC->DrawText((LPCTSTR)m_strMainText, m_strMainText.GetLength(),&rect, m_uAlignFlag | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER );
  136. pDC->SelectObject(pOldFont);
  137. }
  138. }
  139. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  140. COLORREF CStaticFader::GetCurrentColour(COLORREF crText)
  141. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  142. {
  143. UINT uCurrentPercent = (UINT) (GetTickCount() - m_dwStopwatch)/10;
  144. if ( uCurrentPercent >= (UINT)m_nFadePercent) return crText;
  145. short Back_r = GetRValue(m_crBackground);
  146. short Back_g = GetGValue(m_crBackground);
  147. short Back_b = GetBValue(m_crBackground);
  148. short Target_r = GetRValue(crText);
  149. short Target_g = GetGValue(crText);
  150. short Target_b = GetBValue(crText);
  151. short Diff_r = Back_r - Target_r;
  152. short Diff_g = Back_g - Target_g;
  153. short Diff_b = Back_b - Target_b;
  154. short Current_r = Back_r - (short) (((float)Diff_r/(float)m_nFadePercent)*uCurrentPercent);
  155. short Current_g = Back_g - (short) (((float)Diff_g/(float)m_nFadePercent)*uCurrentPercent);
  156. short Current_b = Back_b - (short) (((float)Diff_b/(float)m_nFadePercent)*uCurrentPercent);
  157. return RGB( Current_r, Current_g, Current_b );
  158. }
  159. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  160. void CStaticFader::Initialise(COLORREF crBG, COLORREF crMainText, COLORREF crSubText)
  161. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  162. {
  163. m_crBackground = crBG;
  164. m_crMainText = crMainText;
  165. m_crSubText = crSubText;
  166. }
  167. void CStaticFader::SetMainTextLogFont(LOGFONT &logfont)
  168. {
  169. m_pMainFont->SetLogFont(logfont);
  170. }
  171. void CStaticFader::SetSubTextLogFont(LOGFONT &logfont)
  172. {
  173. m_pSubFont->SetLogFont(logfont);
  174. }