參考 VCKBASE 上繪圖法數字時鐘(於靜態控制項上繪製七段顯示器),但該法需精確計算座標、控制項比例不當易變形。本文提出靜態控制項組合法:每個數字由 7 個獨立靜態控制項組成,透過顏色切換顯示數字,實作簡單且不易變形。
將靜態文字控制項按七段顯示器排列(圖 a),ID 連續編號方便程式處理。每個數字佔 7 個控制項(IDC_STATIC1~7、8~14...)。背景加一矩形控制項,顏色與前景交替產生動態感。

class MyColor {
public:
COLORREF c[10]; // 10 種預設顏色
void PaintStatic(CWnd* dlg, COLORREF cr, CString str) {
CClientDC dc(dlg);
CRect rect;
dlg->GetClientRect(&rect);
CPen pen(PS_SOLID, 1, RGB(50, 0, 110));
dc.SelectObject(&pen);
CBrush brush(cr);
dc.SelectObject(&brush);
dc.Rectangle(rect);
dc.SetBkMode(TRANSPARENT);
dc.TextOut(rect.left + 10, rect.top + 5, str);
}
};
MyColor mc; // 繪圖輔助物件
void CClockDlg::DrawHour(int n) {
int a = n / 10; // 十位
int b = n % 10; // 個位
DrawNumber(IDC_STATIC1, a); // 十位起始 ID
DrawNumber(IDC_STATIC8, b); // 個位起始 ID
}
void CClockDlg::DrawMinute(int m) { /* 類似,IDC_STATIC15/22 */ }
void CClockDlg::DrawSecond(int s) { /* 類似,IDC_STATIC29/36 */ }
void CClockDlg::DrawDot() {
COLORREF C = (n % 2 == 0) ? mc.c[2] : mc.c[7]; // 奇偶秒切換顏色
for (int id = IDC_STATIC43; id <= IDC_STATIC46; id++)
mc.PaintStatic(GetDlgItem(id), C, "");
}
void CClockDlg::DrawNumber(UINT nID, int n) {
// 每個數字對應需點亮的段編號 (1~7)
int segments[10][7] = {
{1,2,3,5,6,7,0}, // 0
{2,5,0,0,0,0,0}, // 1
{1,3,4,5,6,0,0}, // 2
{1,3,4,6,7,0,0}, // 3
{2,3,4,7,0,0,0,0}, // 4
{1,2,4,6,7,0,0}, // 5
{1,2,4,5,6,7,0}, // 6
{1,3,7,0,0,0,0}, // 7
{1,2,3,4,5,6,7}, // 8
{1,2,3,4,6,7,0} // 9
};
int len[10] = {6,2,5,5,4,5,6,3,7,6};
for (int j = 0; j < len[n]; j++) {
mc.PaintStatic(GetDlgItem(nID + segments[n][j] - 1), mc.c[4], "");
}
}
| 優點 | 缺點 |
|---|---|
| 實作簡單,邏輯直觀 | 佔用大量控制項 ID |
| 不易因視窗縮放變形 | 閃爍處理需自行管理 |
| 易擴充至其他數字顯示場合 | 非標準七段顯示器外觀 |
此法適合快速原型開發、教學示範或對外觀要求不高的場合。經簡單擴充可應用於各類介面數字顯示需求。