StaticCounter.cpp
上传用户:tlk791129
上传日期:2007-01-02
资源大小:19k
文件大小:10k
源码类别:

Static控件

开发平台:

Visual C++

  1. // StaticCounter.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "GuruApp.h"
  5. #include "StaticCounter.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CStaticCounter
  13. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  14. CStaticCounter::CStaticCounter()
  15. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  16. {
  17. // Set the default foreground (text) color:
  18. m_bDrawFadedNotches = true;
  19. // Set the default foreground (text) color:
  20. m_crColorForeground = 0x0000FF00; //::GetSysColor(COLOR_BTNTEXT);
  21. // Set the default background color:
  22. m_crColorBackground = 0; //::GetSysColor(COLOR_BTNFACE);
  23. // Set default background brush
  24. m_brBackground.CreateSolidBrush(m_crColorBackground);
  25. // Set default background brush
  26. m_brForeground.CreateSolidBrush(m_crColorForeground);
  27. m_strNumber = "0";
  28. m_bGotMetrics = false;
  29. }
  30. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  31. CStaticCounter::~CStaticCounter()
  32. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. {
  34. }
  35. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  36. BOOL CStaticCounter::OnEraseBkgnd(CDC* pDC) 
  37. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. { return FALSE; }
  39. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  40. void CStaticCounter::SetColorBackGround(COLORREF crColor)
  41. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42. {
  43. // Set new background color
  44. if (crColor != 0xffffffff)
  45. m_crColorBackground = crColor;
  46. else // Set default background color
  47. m_crColorBackground = ::GetSysColor(COLOR_BTNFACE);
  48.     m_brBackground.DeleteObject();
  49.     m_brBackground.CreateSolidBrush(m_crColorBackground);
  50. Invalidate();
  51. }
  52. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  53. void CStaticCounter::SetColorForeGround(COLORREF crColor)
  54. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. {
  56. // Set new foreground color
  57. if (crColor != 0xffffffff)
  58. {
  59. m_crColorForeground = crColor;
  60. }
  61. else // Set default foreground color
  62. {
  63. m_crColorForeground = ::GetSysColor(COLOR_BTNTEXT);
  64. }
  65. // Repaint control
  66. Invalidate(FALSE);
  67. }
  68. BEGIN_MESSAGE_MAP(CStaticCounter, CStatic)
  69. //{{AFX_MSG_MAP(CStaticCounter)
  70. ON_WM_CTLCOLOR_REFLECT()
  71. ON_WM_PAINT()
  72. ON_WM_ERASEBKGND()
  73. //}}AFX_MSG_MAP
  74. END_MESSAGE_MAP()
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CStaticCounter message handlers
  77. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  78. HBRUSH CStaticCounter::CtlColor(CDC* pDC, UINT nCtlColor) 
  79. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. {
  81. // pDC->SetTextColor(m_crColorForeground);
  82. // pDC->SetBkColor(m_crColorBackground);
  83.     return (HBRUSH)m_brBackground; // Return non-NULL brush - the parent's handler is not called
  84. }
  85. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  86. void CStaticCounter::OnPaint() 
  87. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. {
  89. GetClientRect(&m_recClient);
  90. CPaintDC dc(this);
  91. CMemDC memDC(&dc, m_recClient);
  92. CMemDC* pDC = &memDC;
  93. CRect clip;
  94. pDC->GetClipBox(&clip);
  95. pDC->FillSolidRect(&m_recClient, m_crColorBackground );
  96. for (int nCount = 0; nCount< m_strNumber.GetLength(); nCount++)
  97. {
  98. if (m_bDrawFadedNotches)
  99. Draw( pDC, STCOUNTERALL, nCount ); // Draw the faded bits
  100. CString str = m_strNumber[nCount];
  101. if ( m_strNumber[nCount] == '0' ) Draw( pDC, STCOUNTER0, nCount );
  102. else if ( m_strNumber[nCount] == '1' ) Draw( pDC, STCOUNTER1, nCount );
  103. else if ( m_strNumber[nCount] == '2' ) Draw( pDC, STCOUNTER2, nCount );
  104. else if ( m_strNumber[nCount] == '3' ) Draw( pDC, STCOUNTER3, nCount );
  105. else if ( m_strNumber[nCount] == '4' ) Draw( pDC, STCOUNTER4, nCount );
  106. else if ( m_strNumber[nCount] == '5' ) Draw( pDC, STCOUNTER5, nCount );
  107. else if ( m_strNumber[nCount] == '6' ) Draw( pDC, STCOUNTER6, nCount );
  108. else if ( m_strNumber[nCount] == '7' ) Draw( pDC, STCOUNTER7, nCount );
  109. else if ( m_strNumber[nCount] == '8' ) Draw( pDC, STCOUNTER8, nCount );
  110. else if ( m_strNumber[nCount] == '9' ) Draw( pDC, STCOUNTER9, nCount );
  111. }
  112.  }
  113. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  114. void CStaticCounter::Draw(CMemDC* pDC, DWORD dwChar, int nCol)
  115. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  116. {
  117. if (!m_bGotMetrics)
  118. { // Calculate the character metrics in proportion to the size of the control:
  119. int nHeight = m_recClient.bottom;
  120. (nHeight * 0.07) < 1 ? m_nMargin = 1 : m_nMargin = (int)(nHeight * 0.07);
  121. (nHeight * 0.35) < 1 ? m_nNotchLength = 1 : m_nNotchLength = (int)(nHeight * 0.35);
  122. m_nNotchWidth = m_nMargin;
  123. m_bGotMetrics = true;
  124. }
  125. if ( nCol > 0 ) nCol = (nCol*m_nNotchLength) + (m_nMargin*4) * nCol;
  126. COLORREF crNotchColor = m_crColorForeground;
  127. if (dwChar == STCOUNTERALL) { // The color used will be a dim version of normal foreground
  128. int r = GetRValue(m_crColorForeground)/3;
  129. int g = GetGValue(m_crColorForeground)/3;
  130. int b = GetBValue(m_crColorForeground)/3;
  131. crNotchColor = RGB(r,g,b);
  132. }
  133. // Create the Pen accordingly
  134. CPen pen(PS_SOLID | PS_ENDCAP_ROUND, m_nNotchWidth, crNotchColor);
  135. pDC->SelectObject(&pen);
  136. if ( (dwChar & NOTCH1) || dwChar == STCOUNTERALL) { // should I draw the first bar in the display?
  137. pDC->MoveTo( nCol + m_nMargin*2, m_nMargin );
  138. pDC->LineTo( nCol + m_nNotchLength, m_nMargin );
  139. }
  140. if ( dwChar & NOTCH2 || dwChar == STCOUNTERALL) { // should I draw the 2nd bar in the display?
  141. pDC->MoveTo(nCol + m_nNotchLength + m_nMargin, m_nMargin*2);
  142. pDC->LineTo(nCol + m_nNotchLength + m_nMargin, m_nNotchLength + (m_nMargin*2) );
  143. }
  144. if ( dwChar & NOTCH3 || dwChar == STCOUNTERALL) { // should I draw the 3rd bar in the display?
  145. pDC->MoveTo(nCol + m_nNotchLength + m_nMargin, m_nNotchLength + (m_nMargin*4) );
  146. pDC->LineTo(nCol + m_nNotchLength + m_nMargin, m_nNotchLength*2 + (m_nMargin*3) );
  147. }
  148. if ( dwChar & NOTCH4 || dwChar == STCOUNTERALL) { // should I draw the 4th bar in the display?
  149. pDC->MoveTo( nCol + m_nMargin*2, m_nNotchLength*2 + (m_nMargin*4) );
  150. pDC->LineTo( nCol + m_nNotchLength, m_nNotchLength*2 + (m_nMargin*4) );
  151. }
  152. if ( dwChar & NOTCH5 || dwChar == STCOUNTERALL) { // should I draw the 5th bar in the display?
  153. pDC->MoveTo(nCol + m_nMargin, m_nNotchLength + (m_nMargin*4) );
  154. pDC->LineTo(nCol + m_nMargin, m_nNotchLength*2 + (m_nMargin*3) );
  155. }
  156. if ( dwChar & NOTCH6 || dwChar == STCOUNTERALL) { // should I draw the 6th bar in the display?
  157. pDC->MoveTo(nCol + m_nMargin, m_nMargin*2);
  158. pDC->LineTo(nCol + m_nMargin, m_nNotchLength + (m_nMargin*2) );
  159. }
  160. if ( dwChar & NOTCH7 || dwChar == STCOUNTERALL) { // should I draw the 7th bar in the display?
  161. pDC->MoveTo(nCol + m_nMargin*2, m_nNotchLength + (m_nMargin*3) );
  162. pDC->LineTo(nCol + m_nMargin + m_nNotchLength - m_nMargin, m_nNotchLength + (m_nMargin*3) );
  163. }
  164. }
  165. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  166. void CStaticCounter::Display(int nNumber)
  167. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  168. {
  169. m_strNumber.Format("%d", nNumber);
  170. Invalidate(FALSE);
  171. }
  172. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
  173. void CStaticCounter::SetDrawFaded(bool bState)
  174. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  175. {
  176. m_bDrawFadedNotches = bState;
  177. }