📄 demo4_6.c
字号:
1 /****************************************************************/
2 /* Demo4_6 --- Clock demo */
3 /****************************************************************/
4
5 #include <windows.h>
6 #include <time.h>
7 #include <math.h>
8 #include "demo4_6.h"
9
10 #define PI 3.1415926
11
12 #define hourR 50
13 #define minR 75
14 #define secR 80
15 #define TailR 20
16 #define SideR 5
17
18 int PASCAL WinMain(HANDLE, HANDLE, LPSTR, int);
19 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
20 WORD FAR PASCAL TimeProc(HWND, unsigned, WORD, LONG);
21
22 FARPROC lpTimeProc;
23
24 void ChangeTime(HDC, int, int, int);
25 void DrawTime(HDC);
26 void DrawClockFrame(HDC);
27 void DrawClock(HDC);
28
29 int TypeID = IDM_CIRCLE;
30 int MapModeID = IDM_ISO;
31 int BrushID = IDM_GRAY;
32 int hour, min, sec;
33 POINT Client;
34
35
36 /****************************************************************/
37 /* WinMain() */
38 /****************************************************************/
39
40 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
41 LPSTR lpszCmdLine, int nCmdShow)
42 {
43 WNDCLASS wclass;
44 MSG msg;
45 HWND hWnd;
46 char szName[] = "Demo4_6";
47 int ReturnID;
48
49 if (!hPrevInstance)
50 {
51 wclass.style = CS_HREDRAW | CS_VREDRAW;
52 wclass.lpfnWndProc = MainWndProc;
53 wclass.cbClsExtra = 0;
54 wclass.cbWndExtra = 0;
55 wclass.hInstance = hInstance;
56 wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
57 wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
58 wclass.hbrBackground = GetStockObject(LTGRAY_BRUSH);
59 wclass.lpszMenuName = szName;
60 wclass.lpszClassName = szName;
61
62 if (!RegisterClass (&wclass))
63 return (FALSE);
64 }
65
66 hWnd = CreateWindow(
67 szName,
68 "Clock" ,
69 WS_OVERLAPPEDWINDOW,
70 CW_USEDEFAULT,
71 CW_USEDEFAULT,
72 CW_USEDEFAULT,
73 CW_USEDEFAULT,
74 NULL,
75 NULL,
76 hInstance,
77 NULL );
78
79 if (!hWnd)
80 return (FALSE);
81
82 lpTimeProc = MakeProcInstance((FARPROC)TimeProc,
83 hInstance);
84 while (!SetTimer(hWnd, ID_TIMER, 1000, lpTimeProc) )
85 {
86 ReturnID = MessageBox(hWnd,
87 "Too many timers exist",
88 "Warning",
89 MB_RETRYCANCEL |
90 MB_ICONEXCLAMATION);
91
92 if (ReturnID == IDCANCEL)
93 return (FALSE);
94 }
95
96 ShowWindow(hWnd, nCmdShow);
97 UpdateWindow(hWnd);
98
99 while (GetMessage(&msg, NULL, NULL,NULL))
100 {
101 TranslateMessage(&msg);
102 DispatchMessage(&msg);
103 }
104 return (msg.wParam);
105 }
106
107
108
109 /****************************************************************/
110 /* MainWndProc() */
111 /****************************************************************/
112
113 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
114 WORD wParam, LONG lParam)
115 {
116 HDC hDC;
117 HMENU hMenu;
118 PAINTSTRUCT ps;
119 time_t lTime;
120 struct tm *timeofday;
121
122 switch (message)
123 {
124 case WM_CREATE :
125 hMenu = GetMenu(hWnd);
126 CheckMenuItem(hMenu, IDM_CIRCLE, MF_CHECKED);
127 CheckMenuItem(hMenu, IDM_ISO, MF_CHECKED);
128 CheckMenuItem(hMenu, IDM_GRAY, MF_CHECKED);
129
130 time(&lTime);
131 timeofday = (struct tm *)localtime(&lTime);
132 hour = timeofday->tm_hour;
133 min = timeofday->tm_min;
134 sec = timeofday->tm_sec;
135
136 return (0);
137
138 case WM_COMMAND :
139 hMenu = GetMenu(hWnd);
140 switch (wParam)
141 {
142 case IDM_CIRCLE :
143 case IDM_SQUARE :
144
145 if (TypeID == wParam)
146 return (0);
147
148 CheckMenuItem(hMenu, TypeID,
149 MF_UNCHECKED);
150 TypeID = wParam;
151 CheckMenuItem(hMenu, TypeID,
152 MF_CHECKED);
153
154 InvalidateRect(hWnd, NULL, TRUE);
155 break;
156
157 case IDM_ISO :
158 case IDM_ANISO :
159
160 if (MapModeID == wParam)
161 return (0);
162
163 CheckMenuItem(hMenu, MapModeID,
164 MF_UNCHECKED);
165 MapModeID = wParam;
166 CheckMenuItem(hMenu, MapModeID,
167 MF_CHECKED);
168
169 InvalidateRect(hWnd, NULL, TRUE);
170 break;
171
172 case IDM_RED :
173 case IDM_GREEN :
174 case IDM_BLUE :
175 case IDM_YELLOW :
176 case IDM_CYAN :
177 case IDM_MAGENTA :
178 case IDM_WHITE :
179 case IDM_GRAY :
180 case IDM_BLACK :
181
182 if (BrushID == wParam)
183 return (0);
184
185 CheckMenuItem(hMenu, BrushID,
186 MF_UNCHECKED);
187 BrushID = wParam;
188 CheckMenuItem(hMenu, BrushID,
189 MF_CHECKED);
190
191 InvalidateRect(hWnd, NULL, TRUE);
192 break;
193
194 }
195 return (0);
196
197 case WM_SIZE :
198 Client.x = LOWORD(lParam);
199 Client.y = HIWORD(lParam);
200 return (0);
201
202 case WM_PAINT :
203 hDC = BeginPaint(hWnd, &ps);
204
205 DrawClock(hDC);
206
207 EndPaint(hWnd, &ps);
208 return (0);
209
210 case WM_DESTROY :
211 FreeProcInstance(lpTimeProc);
212 PostQuitMessage(0);
213 return (0);
214
215 default :
216 return(DefWindowProc(hWnd, message, wParam, lParam));
217 }
218 }
219
220
221
222 WORD FAR PASCAL TimeProc(HWND hWnd, unsigned message,
223 WORD wParam, LONG lParam)
224 {
225 time_t lTime;
226 struct tm *timeofday;
227 HDC hDC;
228
229 time(&lTime);
230 timeofday = (struct tm*)localtime(&lTime);
231
232 if (sec != timeofday->tm_sec)
233 {
234
235 hDC = GetDC(hWnd);
236
237 /* Change the time */
238 ChangeTime(hDC, timeofday->tm_hour,
239 timeofday->tm_min, timeofday->tm_sec);
240
241 ReleaseDC(hWnd, hDC);
242 }
243
244 return (0);
245 }
246
247
248
249 HANDLE SelectBrush(hDC)
250 {
251 COLORREF rgbColor;
252 HANDLE hBrush;
253
254 switch (BrushID)
255 {
256 case IDM_RED :
257 rgbColor = RGB(255, 0, 0);
258 break;
259
260 case IDM_GREEN :
261 rgbColor = RGB(0, 255, 0);
262 break;
263
264 case IDM_BLUE :
265 rgbColor = RGB(0, 0, 255);
266 break;
267
268 case IDM_YELLOW :
269 rgbColor = RGB(255, 255, 0);
270 break;
271
272 case IDM_CYAN :
273 rgbColor = RGB(0, 255, 255);
274 break;
275
276 case IDM_MAGENTA :
277 rgbColor = RGB(255, 0, 255);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -