⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo4_6.c

📁 WINDOWS图形编程随书光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -