DEMO4_3.C
上传用户:cncajx
上传日期:2007-01-03
资源大小:190k
文件大小:14k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1.   1 /****************************************************************/
  2.   2 /*         Demo4_3   ---  Clock demo                            */
  3.   3 /****************************************************************/
  4.   4 
  5.   5 #include <windows.h>
  6.   6 #include <time.h>
  7.   7 #include <math.h>
  8.   8 #include "demo4_3.h"
  9.   9 
  10.  10 #define PI     3.1415926
  11.  11 
  12.  12 #define hourR  50
  13.  13 #define minR   75
  14.  14 #define secR   80
  15.  15 #define TailR  20
  16.  16 #define SideR  5
  17.  17 
  18.  18 int  PASCAL  WinMain(HANDLE, HANDLE, LPSTR, int);
  19.  19 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
  20.  20 WORD FAR PASCAL TimeProc(HWND, unsigned, WORD, LONG);
  21.  21 
  22.  22 FARPROC lpTimeProc;
  23.  23 
  24.  24 void ChangeTime(HDC, int, int, int);
  25.  25 void DrawTime(HDC);
  26.  26 void DrawClockFrame(HDC);
  27.  27 void DrawClock(HDC);
  28.  28 
  29.  29 int   TypeID = IDM_CIRCLE;
  30.  30 int   MapModeID = IDM_ISO;
  31.  31 int   hour, min, sec;
  32.  32 POINT Client;
  33.  33 
  34.  34 
  35.  35 /****************************************************************/
  36.  36 /*                      WinMain()                               */
  37.  37 /****************************************************************/
  38.  38 
  39.  39 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
  40.  40                    LPSTR lpszCmdLine, int nCmdShow)
  41.  41 {
  42.  42    WNDCLASS wclass;
  43.  43    MSG      msg;
  44.  44    HWND     hWnd;
  45.  45    char     szName[] = "Demo4_3";
  46.  46    int      ReturnID;
  47.  47 
  48.  48    if (!hPrevInstance)
  49.  49     {
  50.  50         wclass.style         = CS_HREDRAW | CS_VREDRAW;
  51.  51         wclass.lpfnWndProc   = MainWndProc;
  52.  52         wclass.cbClsExtra    = 0;
  53.  53         wclass.cbWndExtra    = 0;
  54.  54         wclass.hInstance     = hInstance;
  55.  55         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  56.  56         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  57.  57         wclass.hbrBackground = GetStockObject(LTGRAY_BRUSH);
  58.  58         wclass.lpszMenuName  = szName;
  59.  59         wclass.lpszClassName = szName;
  60.  60 
  61.  61         if (!RegisterClass (&wclass))
  62.  62            return (FALSE);
  63.  63     }
  64.  64 
  65.  65     hWnd = CreateWindow(
  66.  66                 szName,
  67.  67                 "Clock" ,
  68.  68                 WS_OVERLAPPEDWINDOW,
  69.  69                 CW_USEDEFAULT,
  70.  70                 CW_USEDEFAULT,
  71.  71                 CW_USEDEFAULT,
  72.  72                 CW_USEDEFAULT,
  73.  73                 NULL,
  74.  74                 NULL,
  75.  75                 hInstance,
  76.  76                 NULL );
  77.  77 
  78.  78     if (!hWnd)
  79.  79         return (FALSE);
  80.  80 
  81.  81     lpTimeProc = MakeProcInstance((FARPROC)TimeProc,
  82.  82                                   hInstance);
  83.  83     while (!SetTimer(hWnd, ID_TIMER, 1000, lpTimeProc) )
  84.  84        {
  85.  85           ReturnID = MessageBox(hWnd,
  86.  86                                 "Too many timers exist",
  87.  87                                 "Warning",
  88.  88                                 MB_RETRYCANCEL |
  89.  89                                 MB_ICONEXCLAMATION);
  90.  90 
  91.  91           if (ReturnID == IDCANCEL)
  92.  92               return (FALSE);
  93.  93        }
  94.  94 
  95.  95     ShowWindow(hWnd, nCmdShow);
  96.  96     UpdateWindow(hWnd);
  97.  97 
  98.  98     while (GetMessage(&msg, NULL, NULL,NULL))
  99.  99        {
  100. 100            TranslateMessage(&msg);
  101. 101            DispatchMessage(&msg);
  102. 102        }
  103. 103     return (msg.wParam);
  104. 104 }
  105. 105 
  106. 106 
  107. 107 
  108. 108 /****************************************************************/
  109. 109 /*                      MainWndProc()                           */
  110. 110 /****************************************************************/
  111. 111 
  112. 112 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
  113. 113                             WORD wParam, LONG lParam)
  114. 114 {
  115. 115    HDC           hDC;
  116. 116    HMENU         hMenu;
  117. 117    PAINTSTRUCT   ps;
  118. 118    time_t        lTime;
  119. 119    struct tm     *timeofday;
  120. 120 
  121. 121    switch (message)
  122. 122     {
  123. 123       case WM_CREATE :
  124. 124                 hMenu = GetMenu(hWnd);
  125. 125                 CheckMenuItem(hMenu, IDM_CIRCLE, MF_CHECKED);
  126. 126                 CheckMenuItem(hMenu, IDM_ISO, MF_CHECKED);
  127. 127 
  128. 128                 time(&lTime);
  129. 129                 timeofday = (struct tm *)localtime(&lTime);
  130. 130                 hour = timeofday->tm_hour;
  131. 131                 min  = timeofday->tm_min;
  132. 132                 sec  = timeofday->tm_sec;
  133. 133 
  134. 134                 return (0);
  135. 135 
  136. 136       case WM_COMMAND :
  137. 137                 hMenu = GetMenu(hWnd);
  138. 138                 switch (wParam)
  139. 139                   {
  140. 140                     case IDM_CIRCLE :
  141. 141                     case IDM_SQUARE :
  142. 142 
  143. 143                          if (TypeID == wParam)
  144. 144                             return (0);
  145. 145 
  146. 146                          CheckMenuItem(hMenu, TypeID,
  147. 147                                         MF_UNCHECKED);
  148. 148                          TypeID = wParam;
  149. 149                          CheckMenuItem(hMenu, TypeID,
  150. 150                                         MF_CHECKED);
  151. 151 
  152. 152                          InvalidateRect(hWnd, NULL, TRUE);
  153. 153                          break;
  154. 154 
  155. 155                     case IDM_ISO :
  156. 156                     case IDM_ANISO :
  157. 157 
  158. 158                          if (MapModeID == wParam)
  159. 159                             return (0);
  160. 160 
  161. 161                          CheckMenuItem(hMenu, MapModeID,
  162. 162                                         MF_UNCHECKED);
  163. 163                          MapModeID = wParam;
  164. 164                          CheckMenuItem(hMenu, MapModeID,
  165. 165                                         MF_CHECKED);
  166. 166 
  167. 167                          InvalidateRect(hWnd, NULL, TRUE);
  168. 168                          break;
  169. 169                   }
  170. 170                 return (0);
  171. 171 
  172. 172       case WM_SIZE :
  173. 173                 Client.x = LOWORD(lParam);
  174. 174                 Client.y = HIWORD(lParam);
  175. 175                 return (0);
  176. 176 
  177. 177       case WM_PAINT :
  178. 178                 hDC = BeginPaint(hWnd, &ps);
  179. 179 
  180. 180                 DrawClock(hDC);
  181. 181 
  182. 182                 EndPaint(hWnd, &ps);
  183. 183                 return (0);
  184. 184 
  185. 185       case WM_DESTROY :
  186. 186                 FreeProcInstance(lpTimeProc);
  187. 187                 PostQuitMessage(0);
  188. 188                 return (0);
  189. 189 
  190. 190       default :
  191. 191          return(DefWindowProc(hWnd, message, wParam, lParam));
  192. 192     }
  193. 193 }
  194. 194 
  195. 195 
  196. 196 
  197. 197 WORD FAR PASCAL TimeProc(HWND hWnd, unsigned message,
  198. 198                          WORD wParam, LONG lParam)
  199. 199 {
  200. 200    time_t      lTime;
  201. 201    struct tm   *timeofday;
  202. 202    HDC         hDC;
  203. 203 
  204. 204    time(&lTime);
  205. 205    timeofday = (struct tm*)localtime(&lTime);
  206. 206 
  207. 207    if (sec != timeofday->tm_sec)
  208. 208      {
  209. 209 
  210. 210         hDC = GetDC(hWnd);
  211. 211 
  212. 212         /*  Change the time  */
  213. 213         ChangeTime(hDC, timeofday->tm_hour,
  214. 214                    timeofday->tm_min, timeofday->tm_sec);
  215. 215 
  216. 216         ReleaseDC(hWnd, hDC);
  217. 217      }
  218. 218 
  219. 219    return (0);
  220. 220 }
  221. 221 
  222. 222 
  223. 223 
  224. 224 void ChangeTime(HDC hDC, int h, int m, int s)
  225. 225 {
  226. 226    float  Rad;
  227. 227    POINT  Head, Tail, Side1, Side2;
  228. 228 
  229. 229    if (sec == s)
  230. 230       return ;
  231. 231 
  232. 232    if (MapModeID == IDM_ISO)
  233. 233        SetMapMode(hDC, MM_ISOTROPIC);
  234. 234    else
  235. 235        SetMapMode(hDC, MM_ANISOTROPIC);
  236. 236 
  237. 237    SetWindowExt(hDC, 200, 200);
  238. 238    SetViewportExt(hDC, Client.x, -Client.y);
  239. 239 
  240. 240    SetViewportOrg(hDC, Client.x/2, Client.y/2);
  241. 241 
  242. 242    SetROP2(hDC, R2_NOTXORPEN);
  243. 243 
  244. 244    /*   Clear the sec pin   */
  245. 245    Rad = PI/2 - 2*PI*sec/60;
  246. 246    Head.x  = secR  * cos(Rad);
  247. 247    Head.y  = secR  * sin(Rad);
  248. 248    Tail.x  = 0;
  249. 249    Tail.y  = 0;
  250. 250    MoveTo(hDC, Head.x, Head.y);
  251. 251    LineTo(hDC, Tail.x, Tail.y);
  252. 252 
  253. 253    if (min != m || hour != h)
  254. 254      {
  255. 255         SetROP2(hDC, R2_NOTCOPYPEN);
  256. 256 
  257. 257         /*   Clear the hour pin   */
  258. 258         Rad = PI/2 - (2*PI*hour/12 + 2*PI*min/60/12);
  259. 259         Head.x  = hourR * cos(Rad);
  260. 260         Head.y  = hourR * sin(Rad);
  261. 261         Tail.x  = TailR * cos(Rad+PI);
  262. 262         Tail.y  = TailR * sin(Rad+PI);
  263. 263         Side1.x = SideR * cos(Rad+PI/2);
  264. 264         Side1.y = SideR * sin(Rad+PI/2);
  265. 265         Side2.x = SideR * cos(Rad-PI/2);
  266. 266         Side2.y = SideR * sin(Rad-PI/2);
  267. 267 
  268. 268         MoveTo(hDC, Head.x, Head.y);
  269. 269         LineTo(hDC, Side1.x, Side1.y);
  270. 270         LineTo(hDC, Tail.x, Tail.y);
  271. 271         LineTo(hDC, Side2.x, Side2.y);
  272. 272         LineTo(hDC, Head.x, Head.y);
  273. 273 
  274. 274         /*   Clear the min pin   */
  275. 275         Rad = PI/2 - 2*PI*min/60;
  276. 276         Head.x  = minR  * cos(Rad);
  277. 277         Head.y  = minR  * sin(Rad);
  278. 278         Tail.x  = TailR * cos(Rad+PI);
  279. 279         Tail.y  = TailR * sin(Rad+PI);
  280. 280         Side1.x = SideR * cos(Rad+PI/2);
  281. 281         Side1.y = SideR * sin(Rad+PI/2);
  282. 282         Side2.x = SideR * cos(Rad-PI/2);
  283. 283         Side2.y = SideR * sin(Rad-PI/2);
  284. 284 
  285. 285         MoveTo(hDC, Head.x, Head.y);
  286. 286         LineTo(hDC, Side1.x, Side1.y);
  287. 287         LineTo(hDC, Tail.x, Tail.y);
  288. 288         LineTo(hDC, Side2.x, Side2.y);
  289. 289         LineTo(hDC, Head.x, Head.y);
  290. 290 
  291. 291         /*   Update the current hour and min   */
  292. 292         hour = h;
  293. 293         min  = m;
  294. 294 
  295. 295         SetROP2(hDC, R2_COPYPEN);
  296. 296 
  297. 297         /*   Redraw the hour pin   */
  298. 298         Rad = PI/2 - (2*PI*hour/12 + 2*PI*min/60/12);
  299. 299         Head.x  = hourR * cos(Rad);
  300. 300         Head.y  = hourR * sin(Rad);
  301. 301         Tail.x  = TailR * cos(Rad+PI);
  302. 302         Tail.y  = TailR * sin(Rad+PI);
  303. 303         Side1.x = SideR * cos(Rad+PI/2);
  304. 304         Side1.y = SideR * sin(Rad+PI/2);
  305. 305         Side2.x = SideR * cos(Rad-PI/2);
  306. 306         Side2.y = SideR * sin(Rad-PI/2);
  307. 307 
  308. 308         MoveTo(hDC, Head.x, Head.y);
  309. 309         LineTo(hDC, Side1.x, Side1.y);
  310. 310         LineTo(hDC, Tail.x, Tail.y);
  311. 311         LineTo(hDC, Side2.x, Side2.y);
  312. 312         LineTo(hDC, Head.x, Head.y);
  313. 313 
  314. 314         /*   Redraw the min pin   */
  315. 315         Rad = PI/2 - 2*PI*min/60;
  316. 316         Head.x  = minR  * cos(Rad);
  317. 317         Head.y  = minR  * sin(Rad);
  318. 318         Tail.x  = TailR * cos(Rad+PI);
  319. 319         Tail.y  = TailR * sin(Rad+PI);
  320. 320         Side1.x = SideR * cos(Rad+PI/2);
  321. 321         Side1.y = SideR * sin(Rad+PI/2);
  322. 322         Side2.x = SideR * cos(Rad-PI/2);
  323. 323         Side2.y = SideR * sin(Rad-PI/2);
  324. 324 
  325. 325         MoveTo(hDC, Head.x, Head.y);
  326. 326         LineTo(hDC, Side1.x, Side1.y);
  327. 327         LineTo(hDC, Tail.x, Tail.y);
  328. 328         LineTo(hDC, Side2.x, Side2.y);
  329. 329         LineTo(hDC, Head.x, Head.y);
  330. 330      }
  331. 331 
  332. 332    /*   Update the current sec   */
  333. 333    sec = s;
  334. 334 
  335. 335    SetROP2(hDC, R2_NOTXORPEN);
  336. 336 
  337. 337    /*   Redraw the sec pin   */
  338. 338    Rad = PI/2 - 2*PI*sec/60;
  339. 339    Head.x  = secR  * cos(Rad);
  340. 340    Head.y  = secR  * sin(Rad);
  341. 341    Tail.x  = 0;
  342. 342    Tail.y  = 0;
  343. 343 
  344. 344    MoveTo(hDC, Head.x, Head.y);
  345. 345    LineTo(hDC, Tail.x, Tail.y);
  346. 346 }
  347. 347 
  348. 348 
  349. 349 void DrawTime(HDC hDC)
  350. 350 {
  351. 351    float  Rad;
  352. 352    POINT  Head, Tail, Side1, Side2;
  353. 353 
  354. 354    /*   Draw the hour   */
  355. 355    Rad = PI/2 - (2*PI*hour/12 + 2*PI*min/60/12);
  356. 356    Head.x  = hourR * cos(Rad);
  357. 357    Head.y  = hourR * sin(Rad);
  358. 358    Tail.x  = TailR * cos(Rad+PI);
  359. 359    Tail.y  = TailR * sin(Rad+PI);
  360. 360    Side1.x = SideR * cos(Rad+PI/2);
  361. 361    Side1.y = SideR * sin(Rad+PI/2);
  362. 362    Side2.x = SideR * cos(Rad-PI/2);
  363. 363    Side2.y = SideR * sin(Rad-PI/2);
  364. 364 
  365. 365    MoveTo(hDC, Head.x, Head.y);
  366. 366    LineTo(hDC, Side1.x, Side1.y);
  367. 367    LineTo(hDC, Tail.x, Tail.y);
  368. 368    LineTo(hDC, Side2.x, Side2.y);
  369. 369    LineTo(hDC, Head.x, Head.y);
  370. 370 
  371. 371    /*   Draw the min   */
  372. 372    Rad = PI/2 - 2*PI*min/60;
  373. 373    Head.x  = minR  * cos(Rad);
  374. 374    Head.y  = minR  * sin(Rad);
  375. 375    Tail.x  = TailR * cos(Rad+PI);
  376. 376    Tail.y  = TailR * sin(Rad+PI);
  377. 377    Side1.x = SideR * cos(Rad+PI/2);
  378. 378    Side1.y = SideR * sin(Rad+PI/2);
  379. 379    Side2.x = SideR * cos(Rad-PI/2);
  380. 380    Side2.y = SideR * sin(Rad-PI/2);
  381. 381 
  382. 382    MoveTo(hDC, Head.x, Head.y);
  383. 383    LineTo(hDC, Side1.x, Side1.y);
  384. 384    LineTo(hDC, Tail.x, Tail.y);
  385. 385    LineTo(hDC, Side2.x, Side2.y);
  386. 386    LineTo(hDC, Head.x, Head.y);
  387. 387 
  388. 388    /*   Draw the sec   */
  389. 389    SetROP2(hDC, R2_NOTXORPEN);
  390. 390 
  391. 391    Rad     = PI/2 - 2*PI*sec/60;
  392. 392    Head.x  = secR  * cos(Rad);
  393. 393    Head.y  = secR  * sin(Rad);
  394. 394    Tail.x  = 0;
  395. 395    Tail.y  = 0;
  396. 396 
  397. 397    MoveTo(hDC, Head.x, Head.y);
  398. 398    LineTo(hDC, Tail.x, Tail.y);
  399. 399 }
  400. 400 
  401. 401 
  402. 402 
  403. 403 void DrawClockFrame(HDC hDC)
  404. 404 {
  405. 405    POINT  Center;
  406. 406    int    i;
  407. 407    float  Rad;
  408. 408 
  409. 409    SelectObject(hDC, GetStockObject(WHITE_BRUSH));
  410. 410 
  411. 411    if (TypeID == IDM_CIRCLE)
  412. 412       Ellipse(hDC, -97, -97, 97, 97);
  413. 413    else
  414. 414       Rectangle(hDC, -97, -97, 97, 97);
  415. 415 
  416. 416    SelectObject(hDC, GetStockObject(BLACK_BRUSH));
  417. 417 
  418. 418    for (i=0; i<360; i+=6)
  419. 419      {
  420. 420         Rad = 2*PI*i/360;
  421. 421         Center.x = 90 * cos(Rad);
  422. 422         Center.y = 90 * sin(Rad);
  423. 423 
  424. 424         if (i%30 == 0)
  425. 425             Rectangle(hDC, Center.x-3, Center.y-3,
  426. 426                            Center.x+3, Center.y+3);
  427. 427         else
  428. 428         if (TypeID == IDM_CIRCLE &&
  429. 429                Client.x>=100 && Client.y>=100)
  430. 430             SetPixel(hDC, Center.x, Center.y,
  431. 431                      RGB(0, 0, 0));
  432. 432      }
  433. 433 }
  434. 434 
  435. 435 
  436. 436 
  437. 437 void DrawClock(HDC hDC)
  438. 438 {
  439. 439    if (MapModeID == IDM_ISO)
  440. 440        SetMapMode(hDC, MM_ISOTROPIC);
  441. 441    else
  442. 442        SetMapMode(hDC, MM_ANISOTROPIC);
  443. 443 
  444. 444    SetWindowExt(hDC, 200, 200);
  445. 445    SetViewportExt(hDC, Client.x, -Client.y);
  446. 446 
  447. 447    SetViewportOrg(hDC, Client.x/2, Client.y/2);
  448. 448 
  449. 449    DrawClockFrame(hDC);
  450. 450    DrawTime(hDC);
  451. 451 }