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

VC++ 對話框客戶區平鋪背景圖片 (OnEraseBkgnd 實作)

     編輯:VC 教學

核心代碼


BOOL CBmpBgDlg::OnEraseBkgnd(CDC* pDC) {
    CRect rc; GetClientRect(&rc);
    BITMAP bm; m_bmp.GetObject(sizeof(BITMAP), &bm); // m_bmp 為 CBitmap 成員

    CDC memDC; memDC.CreateCompatibleDC(pDC);
    CBitmap* pOld = memDC.SelectObject(&m_bmp);

    // 平鋪繪製
    for (int x = 0; x < rc.Width(); x += bm.bmWidth)
        for (int y = 0; y < rc.Height(); y += bm.bmHeight)
            pDC->BitBlt(x, y, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);

    memDC.SelectObject(pOld);
    return TRUE; // 告訴系統背景已處理,阻止預設擦除
}

初始化


BOOL CBmpBgDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    m_bmp.LoadBitmap(IDB_DIALOG_BG); // 24-bit BMP
    return TRUE;
}

進階:拉伸填滿 (非平鋪)


pDC->StretchBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

注意事項

  • 返回 `TRUE` 關鍵:防止系統預設 `FillSolidRect` 覆蓋導致閃爍。
  • 若對話框有 `WS_CLIPCHILDREN`,子控制項區域不會觸發 `OnEraseBkgnd`,無需額外處理。
  • 高 DPI 下建議使用 `StretchBlt` 配合 `SetStretchBltMode(HALFTONE)` 獲得較佳畫質。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved