在 Visual C++ 6.0 時代,利用 GDI 繪圖函式搭配簡單的數學運算,即可實現極具視覺效果的動畫程式。本文將透過一個「圖形化類比時鐘」的完整範例,深入淺出地講解如何運用結構指標、時間處理函式、圖形初始化與雙緩衝動畫原理,打造一支秒針流暢轉動的即時時鐘程式。
程式引入 <time.h>、<graphics.h> 等標頭檔,並定義 PI 常數供三角函數計算使用。time_t 型別實為 long,用於儲存自 1970 年紀元以來的總秒數;struct tm *pt 則是指向時間結構的指標,方便後續拆解時、分、秒。
initgraph(&driver, &mode, "c:\\BC31\\BGI\\") 將顯示器切換至圖形模式,DETECT 讓驅動程式自動偵測最佳解析度。getmaxx() 與 getmaxy() 取得螢幕中心座標 (x, y) 作為時鐘圓心,setbkcolor(WHITE) 設定白色背景,setlinestyle(0,1,3) 將線條設為 3 像素寬的實線,circle(x, y, Rc) 繪製外框圓圈(半徑 130)。
核心邏輯位於 while (!kbhit()) 迴圈中:
time(<ime) 讀取紀元秒數,localtime(<ime) 轉換為 struct tm 並回傳指標給 pt。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 點鐘方向。LIGHTRED 畫出秒針 → delay(50) 短暫延遲 → 再以背景色 BLACK 重畫同一條線「擦除」舊秒針 → 迴圈重繪新位置。這種「畫-擦-畫」手法即為最基礎的雙緩衡動畫原理,避免畫面閃爍。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) 獲得更流暢、無閃爍的效果。