首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 數字時鐘實作:利用單一位圖繪製 0-9 及符號

     編輯:程式設計綜合問答

擁有一張包含「0123456789:-」字符的位圖(每字符等寬),需在 MFC 中依目前時間動態繪製數字時鐘。核心思路:建立字符到位圖座標的映射,再用 BitBlt 或 StretchBlt 逐字複製像素區塊。

關鍵步驟

  1. 字符索引映射函式:
int GetCharIndex(TCHAR ch) {
    static const TCHAR* map = _T("0123456789:-");
    for (int i = 0; i < 12; ++i)
        if (map[i] == ch) return i;
    return -1; // 不支援字符
}
  1. OnPaint 繪製邏輯:
void CClockDlg::OnPaint() {
    CPaintDC dc(this);
    CTime now = CTime::GetCurrentTime();
    CString str = now.Format(_T("%H:%M:%S")); // 格式如 14:05:09

    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CBitmap bmp;
    bmp.LoadBitmap(IDB_DIGITS); // 包含 12 個字符的位圖資源
    CBitmap* pOld = memDC.SelectObject(&bmp);

    int charW = 20, charH = 30; // 單字符寬高
    int x = 10, y = 10; // 起始座標

    for (int i = 0; i < str.GetLength(); ++i) {
        int idx = GetCharIndex(str[i]);
        if (idx >= 0) {
            dc.BitBlt(x, y, charW, charH, &memDC, idx * charW, 0, SRCCOPY);
            x += charW;
        }
    }
    memDC.SelectObject(pOld);
}

進階優化

  • 使用 CBitmap::LoadBitmap 載入資源,避免重複載入。
  • 若需縮放,改用 StretchBlt 並計算目標矩形。
  • 雙緩衝繪製(先畫到記憶體 DC 再一次性 BitBlt 到螢幕)消除閃爍。
  • 設定 SetTimer(1, 1000, NULL) 每秒觸發 Invalidate() 更新顯示。

擴展:支援更多字符

擴充映射字串(如加入 APM、/ 等),並確保位圖按相同順序排列新字符即可。

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