1. /*--------------------------------------
  2. DIGCLOCK.C -- Digital Clock
  3. (c) Charles Petzold, 1998
  4. --------------------------------------*/
  5.  
  6. #include <Windows.h>
  7.  
  8. #define ID_TIMER 1
  9.  
  10. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  11.  
  12. int WINAPI WinMain( __in HINSTANCE hInstance
  13. , __in_opt HINSTANCE hPrevInstance
  14. , __in LPSTR lpCmdLine
  15. , __in int nShowCmd )
  16. {
  17. static TCHAR szAppName[] = TEXT("DigClock");
  18. HWND hwnd;
  19. MSG msg;
  20. WNDCLASS wndclass;
  21.  
  22. wndclass.style = CS_HREDRAW | CS_VREDRAW;
  23. wndclass.lpfnWndProc = WndProc;
  24. wndclass.cbClsExtra = ;
  25. wndclass.cbWndExtra = ;
  26. wndclass.hInstance = hInstance;
  27. wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  28. wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  29. wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  30. wndclass.lpszMenuName = NULL;
  31. wndclass.lpszClassName = szAppName;
  32.  
  33. if (!RegisterClass(&wndclass))
  34. {
  35. MessageBox(NULL, TEXT("Program requires Windows NT!")
  36. , szAppName, MB_ICONERROR);
  37. return ;
  38. }
  39.  
  40. hwnd = CreateWindow(szAppName, TEXT("Digital Clock")
  41. , WS_OVERLAPPEDWINDOW
  42. , CW_USEDEFAULT, CW_USEDEFAULT
  43. , CW_USEDEFAULT, CW_USEDEFAULT
  44. , NULL, NULL, hInstance, NULL);
  45.  
  46. ShowWindow(hwnd, nShowCmd);
  47. UpdateWindow(hwnd);
  48.  
  49. while (GetMessage(&msg, NULL, , ))
  50. {
  51. TranslateMessage(&msg);
  52. DispatchMessage(&msg);
  53. }
  54.  
  55. return msg.wParam;
  56. }
  57.  
  58. void DisplayDigit(HDC hdc, int iNumber)
  59. {
  60. static BOOL fSevenSegment[][] =
  61. {
  62. , , , , , , , //
  63. , , , , , , , //
  64. , , , , , , , //
  65. , , , , , , , //
  66. , , , , , , , //
  67. , , , , , , , //
  68. , , , , , , , //
  69. , , , , , , , //
  70. , , , , , , , //
  71. , , , , , , //
  72. };
  73.  
  74. static POINT ptSegment[][] =
  75. {
  76. , , , , , , , , , , , ,
  77. , , , , , , , , , , , ,
  78. , , , , , , , , , , , ,
  79. , , , , , , , , , , , ,
  80. , , , , , , , , , , , ,
  81. , , , , , , , , , , , ,
  82. , , , , , , , , , , ,
  83.  
  84. };
  85.  
  86. for (int iSeg(); iSeg != ; ++iSeg)
  87. {
  88. if (fSevenSegment[iNumber][iSeg])
  89. Polygon(hdc, ptSegment[iSeg], );
  90. }
  91. }
  92.  
  93. void DisplayTwoDigits(HDC hdc, int iNumber, BOOL fSuppress)
  94. {
  95. if (!fSuppress || (iNumber / != ))
  96. DisplayDigit(hdc, iNumber / );
  97.  
  98. OffsetWindowOrgEx(hdc, -, , NULL);
  99. DisplayDigit(hdc, iNumber % );
  100. OffsetWindowOrgEx(hdc, -, , NULL);
  101. }
  102.  
  103. void DisplayColon(HDC hdc)
  104. {
  105. POINT ptColon[][] = { , , , , , , , ,
  106. , , , , , , , };
  107.  
  108. Polygon(hdc, ptColon[], );
  109. Polygon(hdc, ptColon[], );
  110.  
  111. OffsetWindowOrgEx(hdc, -, , NULL);
  112. }
  113.  
  114. void DisplayTime(HDC hdc, BOOL f24Hour, BOOL fSuppress)
  115. {
  116. SYSTEMTIME st;
  117.  
  118. GetLocalTime(&st);
  119.  
  120. if (f24Hour)
  121. DisplayTwoDigits(hdc, st.wHour, fSuppress);
  122. else
  123. DisplayTwoDigits(hdc, (st.wHour %= ) ? st.wHour : , fSuppress);
  124.  
  125. DisplayColon(hdc);
  126. DisplayTwoDigits(hdc, st.wMinute, FALSE);
  127. DisplayColon(hdc);
  128. DisplayTwoDigits(hdc, st.wSecond, FALSE);
  129. }
  130.  
  131. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  132. {
  133. static BOOL f24Hour, fSuppress;
  134. static HBRUSH hBrushRed;
  135. static int cxClient, cyClient;
  136. HDC hdc;
  137. PAINTSTRUCT ps;
  138. TCHAR szBuffer[];
  139.  
  140. switch (message)
  141. {
  142. case WM_CREATE:
  143. hBrushRed = CreateSolidBrush(RGB(, , ));
  144. SetTimer(hwnd, ID_TIMER, , NULL);
  145.  
  146. //fall through
  147. case WM_SETTINGCHANGE:
  148. GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITIME, szBuffer, );
  149. f24Hour = (szBuffer[] == TEXT(''));
  150.  
  151. GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITLZERO, szBuffer, );
  152. fSuppress = (szBuffer[] == TEXT(''));
  153.  
  154. InvalidateRect(hwnd, NULL, TRUE);
  155. return ;
  156.  
  157. case WM_SIZE:
  158. cxClient = LOWORD(lParam);
  159. cyClient = HIWORD(lParam);
  160. return ;
  161.  
  162. case WM_TIMER:
  163. InvalidateRect(hwnd, NULL, TRUE);
  164. return ;
  165.  
  166. case WM_PAINT:
  167. hdc = BeginPaint(hwnd, &ps);
  168.  
  169. SetMapMode(hdc, MM_ISOTROPIC);
  170. SetWindowExtEx(hdc, , , NULL);
  171. SetViewportExtEx(hdc, cxClient, cyClient, NULL);
  172.  
  173. SetWindowOrgEx(hdc, , , NULL);
  174. SetViewportOrgEx(hdc, cxClient / , cyClient / , NULL);
  175. SelectObject(hdc, GetStockObject(NULL_PEN));
  176. SelectObject(hdc, hBrushRed);
  177.  
  178. DisplayTime(hdc, f24Hour, fSuppress);
  179.  
  180. EndPaint(hwnd, &ps);
  181. return ;
  182.  
  183. case WM_DESTROY:
  184. KillTimer(hwnd, ID_TIMER);
  185. DeleteObject(hBrushRed);
  186. PostQuitMessage();
  187. return ;
  188. }
  189.  
  190. return DefWindowProc(hwnd, message, wParam, lParam);
  191. }

DIGCLOCK.C

第八章 计时器(DIGCLOCK)的更多相关文章

  1. 第八章 计时器(BEEPER1)

    *------------------------------------- BEEPER1.C -- Timer Demo Program No. (c) Charles Petzold, ---- ...

  2. 第八章 计时器(BEEPER2)

    /*------------------------------------- BEEPER2.C -- Timer Demo Program No.1 (c) Charles Petzold, 19 ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. android 两种实现计时器时分秒的实现,把时间放在你的手中~

    可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲 ...

  5. TCP四种计时器

    TCP共使用以下四种计时器,即重传计时器.坚持计时器.保活计时器和时间等待计时器 .这几个计时器的主要特点如下:      1.重传计时器      当TCP发送报文段时,就创建该特定报文段的重传计时 ...

  6. C# - 计时器Timer

    System.Timers.Timer 服务器计时器,允许指定在应用程序中引发事件的重复时间间隔. using System.Timers: // 在应用程序中生成定期事件 public class ...

  7. JavaScript学习笔记5 之 计时器 & scroll、offset、client系列属性 & 图片无缝滚动

    一.计时器 setInterval ( 函数/名称 , 毫秒数 )表示每经过一定的毫秒后,执行一次相应的函数(重复) setTimeout ( 函数/名称 , 毫秒数 ) 表示经过一定的毫秒后,只执行 ...

  8. 精通Web Analytics 2.0 (10) 第八章:竞争情报分析

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第八章:竞争情报分析 在现实世界中,收集竞争情报可能意味着雇人在竞争对手的垃圾桶(实际会发生!)翻找. 在虚拟世界中,堆如山的数 ...

  9. VBA中使用计时器的两种方法

    '================================ ' VBA采用Application.OnTime实现计时器 ' ' http://www.cnhup.com '========= ...

随机推荐

  1. vue 2.x之组件的数据传递(一)

    这是根据官方提供的脚手架vue-cli搭建,通过简单的案例来介绍vue数据的传递的方式,根据自己平时用到的,来做简单的总结: 1.父组件传递数据给子组件 父组件传递数据给子组件,需要把子组件引入,并挂 ...

  2. 牛客网剑指offer java 全部题解

    经过数月的努力,终于更完了牛客网的66道剑指offer,以下的顺序和大家在牛客网的顺序是一样的(排序也花了不少时间),希望对大家找工作/提高算法能力能起到些许帮助. 每天一道剑指offer-二维数组中 ...

  3. [转]wx.getUserInfo(OBJECT) 微信小程序 获取用户信息

    本文转自:http://mp.weixin.qq.com/debug/wxadoc/dev/api/open.html wx.getUserInfo(OBJECT) 获取用户信息,withCreden ...

  4. chrome 等浏览器不支持本地ajax请求的问题

    chrome 等浏览器不支持本地ajax请求的问题 XMLHttpRequest cannot load file:///D:/WWW/angularlx/ui-router-test/templat ...

  5. C# list的合并

    转自:https://www.cnblogs.com/liguanghui/archive/2011/11/09/2242309.html List<int> listA = new Li ...

  6. Myeclipse安装与破解

    安装包+破解包 链接:https://pan.baidu.com/s/1G4mYsTOMDixyr2UmdqqY5A 提取码:a2n8 红色框框内的是安装包,蓝色框框内的是破解包 安装过程中比较简单, ...

  7. ZAB 算法

    ZAB (Zookeeper Atomic Broadcast )  zookeeper原子消息广播协议 保证:分布式数据一致性  所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为 ...

  8. 设计模式--单例模式(学习Learning hard大神笔记实践)

    根据大神博客园中的文章,自己亲手敲了一遍,对每个解说点都自己动手进行实践,收获颇丰,谢谢Learning hard大神,原文地址http://www.cnblogs.com/zhili/p/Desig ...

  9. Leet Palindrome Partitioning II

    class Solution { public: int minCut(string s) { int len = s.length(); ]; char* s_dp = new char[len * ...

  10. 说说HTML5中label标签的可访问性问题——张鑫旭

    一.开篇叨叨 一般稍微有些经验的页面制作人员都知道label标签可以优雅地扩大表单控件元素的点击区域,例如,单纯的单选框点击区域就鼻屎那么大的地方,经常会点不到位置.因此,label标签的使用对于提高 ...