首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 6.0 圖形程式設計與動畫技術實戰:打造動態類比時鐘

     編輯:VC 教學

前言

在 Visual C++ 6.0 時代,利用 GDI 繪圖函式搭配簡單的數學運算,即可實現極具視覺效果的動畫程式。本文將透過一個「圖形化類比時鐘」的完整範例,深入淺出地講解如何運用結構指標、時間處理函式、圖形初始化與雙緩衝動畫原理,打造一支秒針流暢轉動的即時時鐘程式。

核心程式架構解析

1. 標頭檔與常數定義

程式引入 <time.h>、<graphics.h> 等標頭檔,並定義 PI 常數供三角函數計算使用。time_t 型別實為 long,用於儲存自 1970 年紀元以來的總秒數;struct tm *pt 則是指向時間結構的指標,方便後續拆解時、分、秒。

2. 圖形模式初始化

initgraph(&driver, &mode, "c:\\BC31\\BGI\\") 將顯示器切換至圖形模式,DETECT 讓驅動程式自動偵測最佳解析度。getmaxx() 與 getmaxy() 取得螢幕中心座標 (x, y) 作為時鐘圓心,setbkcolor(WHITE) 設定白色背景,setlinestyle(0,1,3) 將線條設為 3 像素寬的實線,circle(x, y, Rc) 繪製外框圓圈(半徑 130)。

3. 動畫主迴圈與秒針繪製

核心邏輯位於 while (!kbhit()) 迴圈中:

  1. 取得系統時間:time(<ime) 讀取紀元秒數,localtime(<ime) 轉換為 struct tm 並回傳指標給 pt。
  2. 計算秒針尖端座標:
    alpha = 2*PI/60.0 代表每秒轉動的弧度。
    xSecond = x + Rs * cos(pt->tm_sec * alpha - PI/2)
    ySecond = y + Rs * sin(pt->tm_sec * alpha - PI/2)
    其中 Rs=100 為秒針長度,-PI/2 修正 0 秒指向 12 點鐘方向。
  3. 雙緩衝動畫技巧:
    先以 LIGHTRED 畫出秒針 → delay(50) 短暫延遲 → 再以背景色 BLACK 重畫同一條線「擦除」舊秒針 → 迴圈重繪新位置。這種「畫-擦-畫」手法即為最基礎的雙緩衡動畫原理,避免畫面閃爍。

4. 結構體 struct tm 詳細欄位

time.h 定義的 tm 結構包含:tm_sec(秒)、tm_min(分)、tm_hour(時, 0-23)、tm_mday(日)、tm_mon(月, 0-11)、tm_year(年-1900)、tm_wday(星期, 0=星期日)、tm_yday(年間第幾天)、tm_isdst(夏令時間旗標)。程式僅使用 tm_sec 即可驅動秒針。

關鍵技術總結

  • 時間處理:time() + localtime() 組合,將時間戳轉為人類可讀結構。
  • 指標運用:pt->tm_sec 透過指標存取結構成員,程式碼簡潔高效。
  • 三角函數應用:極座標轉直角座標,實現圓周運動軌跡。
  • 動畫實現:無雙緩衝記憶體時,以「背景色覆蓋」模擬雙緩衝,降低記憶體需求。

擴展建議

若要完成功能更完整的時鐘,可同步繪製時針、分針(長度較短、轉動角度公式調整),並加入數字刻度、日期顯示。若移植至現代 Windows 環境,建議改用 WM_TIMER 訊息驅動 InvalidateRect 觸發 WM_PAINT 重繪,配合 Double Buffering (記憶體 DC) 獲得更流暢、無閃爍的效果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved