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

📄 demo4_6.c

📁 WINDOWS图形编程随书光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
278                 break;
279     }
280 
281    if (BrushID < IDM_WHITE)
282       hBrush = CreateSolidBrush(rgbColor);
283    else
284      {
285         if (BrushID == IDM_WHITE)
286           hBrush = GetStockObject(WHITE_BRUSH);
287         else
288         if (BrushID == IDM_GRAY)
289           hBrush = GetStockObject(LTGRAY_BRUSH);
290         else
291           hBrush = GetStockObject(BLACK_BRUSH);
292      }
293 
294    return(SelectObject(hDC, hBrush));
295 }
296 
297 
298 
299 void ChangeTime(HDC hDC, int h, int m, int s)
300 {
301    float  Rad;
302    POINT  Head, Tail, Side1, Side2;
303    POINT  Poly[4];
304    HANDLE hBrush, hPreBrush;
305    HANDLE hPen;
306 
307    if (sec == s)
308       return ;
309 
310    if (MapModeID == IDM_ISO)
311        SetMapMode(hDC, MM_ISOTROPIC);
312    else
313        SetMapMode(hDC, MM_ANISOTROPIC);
314 
315    SetWindowExt(hDC, 200, 200);
316    SetViewportExt(hDC, Client.x, -Client.y);
317 
318    SetViewportOrg(hDC, Client.x/2, Client.y/2);
319 
320    SetROP2(hDC, R2_NOTXORPEN);
321 
322    /*   Clear the sec pin   */
323    Rad = PI/2 - 2*PI*sec/60;
324    Head.x  = secR  * cos(Rad);
325    Head.y  = secR  * sin(Rad);
326    Tail.x  = 0;
327    Tail.y  = 0;
328    MoveTo(hDC, Head.x, Head.y);
329    LineTo(hDC, Tail.x, Tail.y);
330 
331    if (min != m || hour != h)
332      {
333         SetROP2(hDC, R2_COPYPEN);
334 
335         hBrush = GetStockObject(WHITE_BRUSH);
336         SelectObject(hDC, hBrush);
337         hPen = GetStockObject(WHITE_PEN);
338         SelectObject(hDC, hPen);
339 
340         /*   Clear the hour pin   */
341         Rad = PI/2 - (2*PI*hour/12 + 2*PI*min/60/12);
342         Head.x  = hourR * cos(Rad);
343         Head.y  = hourR * sin(Rad);
344         Tail.x  = TailR * cos(Rad+PI);
345         Tail.y  = TailR * sin(Rad+PI);
346         Side1.x = SideR * cos(Rad+PI/2);
347         Side1.y = SideR * sin(Rad+PI/2);
348         Side2.x = SideR * cos(Rad-PI/2);
349         Side2.y = SideR * sin(Rad-PI/2);
350 
351         Poly[0] = Head;
352         Poly[1] = Side1;
353         Poly[2] = Tail;
354         Poly[3] = Side2;
355         Polygon(hDC, Poly, 4);
356 
357         /*   Clear the min pin   */
358         Rad = PI/2 - 2*PI*min/60;
359         Head.x  = minR  * cos(Rad);
360         Head.y  = minR  * sin(Rad);
361         Tail.x  = TailR * cos(Rad+PI);
362         Tail.y  = TailR * sin(Rad+PI);
363         Side1.x = SideR * cos(Rad+PI/2);
364         Side1.y = SideR * sin(Rad+PI/2);
365         Side2.x = SideR * cos(Rad-PI/2);
366         Side2.y = SideR * sin(Rad-PI/2);
367 
368         Poly[0] = Head;
369         Poly[1] = Side1;
370         Poly[2] = Tail;
371         Poly[3] = Side2;
372         Polygon(hDC, Poly, 4);
373 
374         /*   Update the current hour and min   */
375         hour = h;
376         min  = m;
377 
378         /*   Create the brush that matches   */
379         /*      the Brush color menu         */
380         hPreBrush = SelectBrush(hDC);
381 
382         hPen = GetStockObject(BLACK_PEN);
383         SelectObject(hDC, hPen);
384 
385         /*   Redraw the hour pin   */
386         Rad = PI/2 - (2*PI*hour/12 + 2*PI*min/60/12);
387         Head.x  = hourR * cos(Rad);
388         Head.y  = hourR * sin(Rad);
389         Tail.x  = TailR * cos(Rad+PI);
390         Tail.y  = TailR * sin(Rad+PI);
391         Side1.x = SideR * cos(Rad+PI/2);
392         Side1.y = SideR * sin(Rad+PI/2);
393         Side2.x = SideR * cos(Rad-PI/2);
394         Side2.y = SideR * sin(Rad-PI/2);
395 
396         Poly[0] = Head;
397         Poly[1] = Side1;
398         Poly[2] = Tail;
399         Poly[3] = Side2;
400         Polygon(hDC, Poly, 4);
401 
402         /*   Redraw the min pin   */
403         Rad = PI/2 - 2*PI*min/60;
404         Head.x  = minR  * cos(Rad);
405         Head.y  = minR  * sin(Rad);
406         Tail.x  = TailR * cos(Rad+PI);
407         Tail.y  = TailR * sin(Rad+PI);
408         Side1.x = SideR * cos(Rad+PI/2);
409         Side1.y = SideR * sin(Rad+PI/2);
410         Side2.x = SideR * cos(Rad-PI/2);
411         Side2.y = SideR * sin(Rad-PI/2);
412 
413         Poly[0] = Head;
414         Poly[1] = Side1;
415         Poly[2] = Tail;
416         Poly[3] = Side2;
417         Polygon(hDC, Poly, 4);
418 
419         hBrush = SelectObject(hDC, hPreBrush);
420         if (BrushID < IDM_WHITE)
421              DeleteObject(hBrush);
422      }
423 
424    /*   Update the current sec   */
425    sec = s;
426 
427    SetROP2(hDC, R2_NOTXORPEN);
428 
429    /*   Redraw the sec pin   */
430    Rad = PI/2 - 2*PI*sec/60;
431    Head.x  = secR  * cos(Rad);
432    Head.y  = secR  * sin(Rad);
433    Tail.x  = 0;
434    Tail.y  = 0;
435 
436    MoveTo(hDC, Head.x, Head.y);
437    LineTo(hDC, Tail.x, Tail.y);
438 }
439 
440 
441 void DrawTime(HDC hDC)
442 {
443    float  Rad;
444    POINT  Head, Tail, Side1, Side2;
445    POINT  Poly[4];
446    HANDLE hBrush, hPreBrush;
447 
448    /*   Create the brush that matches   */
449    /*      the Brush color menu      */
450    hPreBrush = SelectBrush(hDC);
451 
452    /*   Draw the hour   */
453    Rad = PI/2 - (2*PI*hour/12 + 2*PI*min/60/12);
454    Head.x  = hourR * cos(Rad);
455    Head.y  = hourR * sin(Rad);
456    Tail.x  = TailR * cos(Rad+PI);
457    Tail.y  = TailR * sin(Rad+PI);
458    Side1.x = SideR * cos(Rad+PI/2);
459    Side1.y = SideR * sin(Rad+PI/2);
460    Side2.x = SideR * cos(Rad-PI/2);
461    Side2.y = SideR * sin(Rad-PI/2);
462 
463    Poly[0] = Head;
464    Poly[1] = Side1;
465    Poly[2] = Tail;
466    Poly[3] = Side2;
467    Polygon(hDC, Poly, 4);
468 
469    /*   Draw the min   */
470    Rad = PI/2 - 2*PI*min/60;
471    Head.x  = minR  * cos(Rad);
472    Head.y  = minR  * sin(Rad);
473    Tail.x  = TailR * cos(Rad+PI);
474    Tail.y  = TailR * sin(Rad+PI);
475    Side1.x = SideR * cos(Rad+PI/2);
476    Side1.y = SideR * sin(Rad+PI/2);
477    Side2.x = SideR * cos(Rad-PI/2);
478    Side2.y = SideR * sin(Rad-PI/2);
479 
480    Poly[0] = Head;
481    Poly[1] = Side1;
482    Poly[2] = Tail;
483    Poly[3] = Side2;
484    Polygon(hDC, Poly, 4);
485 
486    hBrush = SelectObject(hDC, hPreBrush);
487    if (BrushID < IDM_WHITE)
488         DeleteObject(hBrush);
489 
490    /*   Draw the sec   */
491    SetROP2(hDC, R2_NOTXORPEN);
492 
493    Rad     = PI/2 - 2*PI*sec/60;
494    Head.x  = secR  * cos(Rad);
495    Head.y  = secR  * sin(Rad);
496    Tail.x  = 0;
497    Tail.y  = 0;
498 
499    MoveTo(hDC, Head.x, Head.y);
500    LineTo(hDC, Tail.x, Tail.y);
501 }
502 
503 
504 
505 void DrawClockFrame(HDC hDC)
506 {
507    POINT  Center;
508    int    i;
509    float  Rad;
510 
511    SelectObject(hDC, GetStockObject(WHITE_BRUSH));
512 
513    if (TypeID == IDM_CIRCLE)
514       Ellipse(hDC, -97, -97, 97, 97);
515    else
516       Rectangle(hDC, -97, -97, 97, 97);
517 
518    SelectObject(hDC, GetStockObject(BLACK_BRUSH));
519 
520    for (i=0; i<360; i+=6)
521      {
522         Rad = 2*PI*i/360;
523         Center.x = 90 * cos(Rad);
524         Center.y = 90 * sin(Rad);
525 
526         if (i%30 == 0)
527             Rectangle(hDC, Center.x-3, Center.y-3,
528                            Center.x+3, Center.y+3);
529         else
530         if (TypeID == IDM_CIRCLE &&
531                Client.x>=100 && Client.y>=100)
532             SetPixel(hDC, Center.x, Center.y,
533                      RGB(0, 0, 0));
534      }
535 }
536 
537 
538 
539 void DrawClock(HDC hDC)
540 {
541    if (MapModeID == IDM_ISO)
542        SetMapMode(hDC, MM_ISOTROPIC);
543    else
544        SetMapMode(hDC, MM_ANISOTROPIC);
545 
546    SetWindowExt(hDC, 200, 200);
547    SetViewportExt(hDC, Client.x, -Client.y);
548 
549    SetViewportOrg(hDC, Client.x/2, Client.y/2);
550 
551    DrawClockFrame(hDC);
552    DrawTime(hDC);
553 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -