DigitST.cpp
上传用户:dhjcdma
上传日期:2007-01-02
资源大小:102k
文件大小:5k
源码类别:

Static控件

开发平台:

Visual C++

  1. // DigitST.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DigitST.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CDigitST
  12. CDigitST::CDigitST()
  13. {
  14. // Default number of digits
  15. m_nPrecision = 2;
  16. // Default value
  17. m_nValue = 0;
  18. // Don't display zeroes
  19. m_bZeroPadding = FALSE;
  20. // Default resize is RIGHT-BOTTOM
  21. m_dwResize = ST_RIGHT | ST_BOTTOM;
  22. m_nWidth = 0;
  23. m_nHeight = 0;
  24. }
  25. CDigitST::~CDigitST()
  26. {
  27. }
  28. BEGIN_MESSAGE_MAP(CDigitST, CStatic)
  29. //{{AFX_MSG_MAP(CDigitST)
  30. ON_WM_PAINT()
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CDigitST message handlers
  35. void CDigitST::OnPaint() 
  36. {
  37. PAINTSTRUCT lpPaint;
  38. BeginPaint(&lpPaint);
  39. CWindowDC dc(this);
  40. // If there is a bitmap loaded
  41. if (m_bmDigit.m_hObject) DrawDigits(&dc);
  42. EndPaint(&lpPaint);
  43. } // End of OnPaint
  44. BOOL CDigitST::SetStyle(UINT nBitmapId, int nPrecision)
  45. {
  46. BITMAP bm;
  47. BOOL bRet;
  48. // Detach any previuos bitmap
  49. m_bmDigit.Detach();
  50. // Load new bitmap
  51. bRet = m_bmDigit.LoadBitmap(nBitmapId);
  52. // If all ok
  53. if (bRet == TRUE)
  54. {
  55. // Get dimension
  56. m_bmDigit.GetBitmap(&bm);
  57. // Width of a SINGLE digit in a 12 digits bitmap
  58. m_nWidth = (int)bm.bmWidth / 12;
  59. // Height of the digits
  60. m_nHeight = bm.bmHeight;
  61. SetPrecision(nPrecision);
  62. }
  63. return bRet;
  64. } // End of SetStyle
  65. void CDigitST::SetValue(int nValue, BOOL bRepaint)
  66. {
  67. // Set new value
  68. m_nValue = nValue;
  69. // Repaint control
  70. if (bRepaint == TRUE) Invalidate();
  71. } // End of SetValue
  72. int CDigitST::GetValue()
  73. {
  74. return m_nValue;
  75. } // End of GetValue
  76. void CDigitST::SetPrecision(int nPrecision, BOOL bResize)
  77. {
  78. // Set number of digits
  79. // Some security
  80. if (nPrecision >= ST_MIN_PRECISION && nPrecision <= ST_MAX_PRECISION)
  81. m_nPrecision = nPrecision;
  82. // Resize control
  83. if (bResize == TRUE) Resize();
  84. } // End of SetPrecision
  85. int CDigitST::GetPrecision()
  86. {
  87. return m_nPrecision;
  88. } // End of GetPrecision
  89. void CDigitST::SetResize(DWORD dwResize, BOOL bResize)
  90. {
  91. m_dwResize = dwResize;
  92. // Resize control
  93. if (bResize == TRUE) Resize();
  94. } // End of SetResize
  95. DWORD CDigitST::GetResize()
  96. {
  97. return m_dwResize;
  98. } // End of GetResize
  99. void CDigitST::SetZeroPadding(BOOL bPad, BOOL bRepaint)
  100. {
  101. // Set new padding style
  102. m_bZeroPadding = bPad;
  103. // Repaint control
  104. if (bRepaint == TRUE) Invalidate();
  105. } // End of SetZeroPadding
  106. BOOL CDigitST::GetZeroPadding()
  107. {
  108. return m_bZeroPadding;
  109. } // End of GetZeroPadding
  110. void CDigitST::Inc(BOOL bRepaint)
  111. {
  112. SetValue(GetValue() + 1, bRepaint);
  113. } // End of Inc
  114. void CDigitST::Dec(BOOL bRepaint)
  115. {
  116. SetValue(GetValue() - 1, bRepaint);
  117. } // End of Dec
  118. const char* CDigitST::GetVersionC()
  119. {
  120.   return "1.0";
  121. } // End of GetVersionC
  122. const short CDigitST::GetVersionI()
  123. {
  124.   return 10; // Divide by 10 to get actual version
  125. } // End of GetVersionI
  126. void CDigitST::DrawDigits(CDC* pDC)
  127. {
  128. char szValue[ST_MAX_PRECISION+1];
  129. int nLoop;
  130. int destX;
  131. CRect rectCtrl;
  132. int nAsciiChar;
  133. CBitmap* pOldBitmap;
  134.     CDC memDC;
  135. memDC.CreateCompatibleDC(pDC);
  136. // Select bitmap
  137. pOldBitmap = memDC.SelectObject(&m_bmDigit);
  138. GetClientRect(rectCtrl);
  139. // Start from more significative digit
  140. destX = BORDER_SPACE;
  141. PrepareString(szValue);
  142. for (nLoop = 0; nLoop < m_nPrecision; nLoop++)
  143. {
  144. if (m_bZeroPadding == TRUE && m_nValue >= 0)
  145. nAsciiChar = 0;
  146. else
  147. nAsciiChar = 10;
  148. // If included in '0'..'9'
  149. if (szValue[nLoop] >= '0' && szValue[nLoop] <= '9')
  150. nAsciiChar = szValue[nLoop] - 48;
  151. // If signed
  152. if (szValue[nLoop] == '-') nAsciiChar = 11;
  153. pDC->BitBlt(destX, BORDER_SPACE, m_nWidth, m_nHeight, &memDC, 0+(m_nWidth*nAsciiChar), 0, SRCCOPY);
  154. destX += m_nWidth;
  155. }
  156. // Restore old selected bitmap
  157. memDC.SelectObject(pOldBitmap);
  158. } // End of DrawDigits
  159. void CDigitST::Resize()
  160. {
  161. CRect rectCtrl;
  162. Invalidate();
  163. // Modify control rect to fit all digits (specified by m_nPrecision)
  164. GetWindowRect(rectCtrl);
  165. GetParent()->ScreenToClient(rectCtrl);
  166. // Resize to RIGHT
  167. if (m_dwResize & ST_RIGHT)
  168. rectCtrl.right = rectCtrl.left + (m_nWidth * m_nPrecision)+(BORDER_SPACE*2);
  169. else
  170. // Resize to LEFT
  171. rectCtrl.left = rectCtrl.right - (m_nWidth * m_nPrecision)-(BORDER_SPACE*2);
  172. // Resize to BOTTOM
  173. if (m_dwResize & ST_BOTTOM)
  174. rectCtrl.bottom = rectCtrl.top + m_nHeight+(BORDER_SPACE*2);
  175. else
  176. // Resize to TOP
  177. rectCtrl.top = rectCtrl.bottom - m_nHeight-(BORDER_SPACE*2);
  178. MoveWindow(rectCtrl);
  179. } // End of Resize
  180. void CDigitST::PrepareString(char* szDest)
  181. {
  182. char szStr[ST_MAX_PRECISION+1];
  183. sprintf(szStr, "%*d", m_nPrecision,m_nValue);
  184. sprintf(szDest, "%*s", m_nPrecision, &szStr[strlen(szStr)-m_nPrecision]);
  185. } // End of PrepareString
  186. #undef ST_MIN_PRECISION
  187. #undef ST_MAX_PRECISION
  188. #undef BORDER_SPACE