EDCLOCK.CPP
上传用户:sunh8215
上传日期:2010-02-13
资源大小:1616k
文件大小:6k
源码类别:

酒店行业

开发平台:

Visual C++

  1. // Usage: See the header, just simple 
  2. // Please Note: Make sure ADD the 12 bitmaps to your project, and 
  3. // sort the ID to correct order. I used IDB_BITMAP1 to IDB_BITMAP12 
  4. // side by side. See following:
  5. //
  6. // Digit:     ID VALUE
  7. //   0        IDB_BITMAP1  100
  8. //   1        IDB_BITMAP2  101
  9. //   2        IDB_BITMAP3  102
  10. //   3        IDB_BITMAP4  103
  11. //   4        IDB_BITMAP5  104
  12. //   5        IDB_BITMAP6  105
  13. //   6        IDB_BITMAP7  106
  14. //   7        IDB_BITMAP8  107
  15. //   8        IDB_BITMAP9  108
  16. //   9        IDB_BITMAP10  109
  17. //   :        IDB_BITMAP11  110
  18. //            IDB_BITMAP12  111
  19. //
  20. // There are three properties.
  21. // face color <-----> SetColor();
  22. // style <-----> SetStyle();
  23. // alarm mode <----> SetAlarm();
  24. // EDClock.cpp : implementation file
  25. //
  26. #include "stdafx.h"
  27. #include "..\resource.h"
  28. #include "EDClock.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. // The resource bitmap face color 
  35. //static COLORREF origin; 
  36. COLORREF CLEDClock::origin = RGB(255, 0, 0); 
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CXJWDigitClock
  39. CLEDClock::CLEDClock()
  40. {
  41. m_bAlarm = FALSE;
  42. m_style = XDC_NOSECOND;
  43. m_color = origin;
  44. for(int i = 0; i< 12; i++) {
  45. HBITMAP temp = (HBITMAP)::CreateMappedBitmap(AfxGetApp()->m_hInstance, i+IDB_BITMAP1, 0, NULL, 0);
  46. m_hBitmap[i] = (HBITMAP)::CopyImage( temp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG | LR_COPYDELETEORG);
  47. }
  48. }
  49. CLEDClock::~CLEDClock()
  50. {
  51. for(int i = 0; i< 12; i++) {
  52. if(m_hBitmap[i])
  53. ::DeleteObject(m_hBitmap[i]);
  54. }
  55. }
  56. BEGIN_MESSAGE_MAP(CLEDClock, CStatic)
  57. //{{AFX_MSG_MAP(CXJWDigitClock)
  58. ON_WM_TIMER()
  59. ON_WM_DESTROY()
  60. ON_WM_ERASEBKGND()
  61. ON_WM_PAINT()
  62. //}}AFX_MSG_MAP
  63. END_MESSAGE_MAP()
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CXJWDigitClock message handlers
  66. void CLEDClock::PreSubclassWindow() 
  67. {
  68. // TODO: Add your specialized code here and/or call the base class
  69. //
  70. // Note: Set the Timer here Pls. 
  71. // Dont set timer in OnCreate(), you cant recieve WM_CREATE 
  72. // when control construted in Dialog template. Say: OnCreate not called.
  73. //
  74. m_nTimer = SetTimer(1, 1000, NULL);
  75. ::GetObject(m_hBitmap[0], sizeof BITMAP, &m_bm);
  76. CStatic::PreSubclassWindow();
  77. }
  78. void CLEDClock::OnDestroy() 
  79. {
  80. CStatic::OnDestroy();
  81. // TODO: Add your message handler code here
  82. KillTimer(m_nTimer);
  83. }
  84. void CLEDClock::OnPaint() 
  85. {
  86. CPaintDC dc(this); // device context for painting
  87. // TODO: Add your message handler code here
  88. /*---------------------进行初始化的显示-------------------*/
  89. CRect rectClient;
  90. GetClientRect(&rectClient);
  91. m_h = rectClient.Height();
  92. m_w = rectClient.Width()/8;
  93. CTime time = CTime::GetCurrentTime();
  94. int nh1 = time.GetHour()/10;
  95. if(nh1)
  96. Output(nh1, 0);
  97. else 
  98. Output(11, 0);
  99. int nh2 = time.GetHour()%10;
  100. Output(nh2, 1);
  101. int nm1 = time.GetMinute()/10;
  102. Output(nm1, 3);
  103. int nm2 = time.GetMinute()%10;
  104. Output(nm2, 4);
  105. int ns1 = time.GetSecond()/10;
  106. Output(ns1, 6);
  107. int s2 = time.GetSecond()%10;
  108. Output(s2, 7);
  109. Output(10, 2); // double points
  110. Output(10, 5); // double points
  111. // Do not call CStatic::OnPaint() for painting messages
  112. }
  113. BOOL CLEDClock::OnEraseBkgnd(CDC* pDC) 
  114. {
  115. // TODO: Add your message handler code here and/or call default
  116. CBrush brush;
  117. brush.CreateSolidBrush( ::GetSysColor(COLOR_WINDOWTEXT) ); 
  118. CBrush* pOldBrush = pDC->SelectObject(&brush);
  119. CRect rectClient;
  120. GetClientRect(&rectClient);
  121. pDC->PatBlt(0, 0, rectClient.Width(), rectClient.Height(), PATCOPY);
  122. pDC->SelectObject(pOldBrush);
  123. return CStatic::OnEraseBkgnd(pDC);
  124. }
  125. void CLEDClock::OnTimer(UINT nIDEvent) 
  126. {
  127. // TODO: Add your message handler code here and/or call default
  128. if(nIDEvent == m_nTimer) {
  129. m_nCount++;
  130. CRect rectClient;
  131. GetClientRect(&rectClient);
  132. m_h = rectClient.Height();
  133. if(m_style == XDC_SECOND) {
  134. m_w = rectClient.Width()/8;
  135. } else {
  136. m_w = rectClient.Width()/5;
  137. }
  138. CTime time = CTime::GetCurrentTime();
  139. int nh1 = time.GetHour()/10;
  140. if(nh1)
  141. Output(nh1, 0);
  142. else 
  143. Output(11, 0);
  144. int nh2 = time.GetHour()%10;
  145. Output(nh2, 1);
  146. int nm1 = time.GetMinute()/10;
  147. Output(nm1, 3);
  148. int nm2 = time.GetMinute()%10;
  149. Output(nm2, 4);
  150. switch(m_style) {
  151. case XDC_SECOND:
  152. {
  153. int ns1 = time.GetSecond()/10;
  154.     Output(ns1, 6);
  155. int s2 = time.GetSecond()%10;
  156. Output(s2, 7);
  157. Output(10, 2); // double points
  158. Output(10, 5); // double points
  159. }
  160. break;
  161. case XDC_NOSECOND:
  162. default:
  163. if(m_bAlarm)
  164. Output(10, 2);
  165. else 
  166. if(m_nCount%2)
  167. Output(10, 2); // double points
  168. else 
  169. Output(11, 2); // 
  170. break;
  171. }
  172. if(m_bAlarm)
  173. MessageBeep(-1);
  174. }
  175. CStatic::OnTimer(nIDEvent);
  176. }
  177. void CLEDClock::Output(UINT digit, UINT pos)
  178. {
  179.     // draw the bitmap
  180. CClientDC dc(this);
  181. CDC dcMem;
  182. dcMem.CreateCompatibleDC(&dc);
  183. // 
  184. // Alarm mode 
  185. // 
  186. if(m_bAlarm && m_nCount%2) 
  187. digit = 11;
  188. CBitmap* pBitmap = CBitmap::FromHandle( m_hBitmap[digit] );
  189. CBitmap* pOldBitmap = dcMem.SelectObject(pBitmap);
  190.     dc.StretchBlt(m_w*pos, 0, m_w, m_h,
  191. &dcMem, 0, 0, m_bm.bmWidth, m_bm.bmHeight, SRCCOPY);
  192.   dcMem.SelectObject(pOldBitmap);
  193. dcMem.DeleteDC();
  194. }
  195. CLEDClock::CClockStyle CLEDClock::SetStyle(CClockStyle style)
  196. {
  197. CClockStyle temp = m_style;
  198. m_style = style;
  199. // if(::IsWindow(m_hWnd))
  200. // Invalidate();
  201. return temp;
  202. }
  203. COLORREF CLEDClock::SetColor(COLORREF color)
  204. {
  205. if(m_color == color)
  206. return color;
  207. COLORREF temp = m_color;
  208. m_color = color;
  209. for(int i = 0; i< 12; i++) {
  210. if(m_hBitmap[i])
  211. ::DeleteObject(m_hBitmap[i]);
  212. COLORMAP mapColor;
  213. mapColor.from = origin;
  214. mapColor.to  = color;
  215. HBITMAP temp = (HBITMAP)::CreateMappedBitmap(AfxGetApp()->m_hInstance, i+IDB_BITMAP1, 0, &mapColor, 1);
  216. m_hBitmap[i] = (HBITMAP)::CopyImage( temp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG | LR_COPYDELETEORG);
  217. }
  218. return temp;
  219. }
  220. BOOL CLEDClock::SetAlarm(BOOL bAlarm /*= TRUE*/)
  221. {
  222. BOOL temp = m_bAlarm;
  223. m_bAlarm = bAlarm;
  224. return temp;
  225. }