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

讓 CEdit 控制項支援背景圖片:透明文字繪製與漸層背景完整實作

     編輯:關於VC++

前言

標準 Windows 控制項 (Edit、ComboBox、ListBox 等) 不支援背景圖片屬性。本文示範如何繼承 CEdit 實作 CMyEditCtrl,透過覆寫 OnEraseBkgnd 繪製背景圖、CtlColor 設定透明文字模式、OnChange/OnLButtonUp 強制重繪解決殘留問題,並支援執行期切換背景圖。

類別設計與關鍵成員


class CMyEditCtrl : public CEdit {
public:
    CBitmap m_bmp;              // 背景位圖
protected:
    CBrush m_brHollow;          // 空心筆刷 (透明背景用)
    CBitmap* m_pbmCurrent;      // 目前繪製位圖指標
    // 訊息對應
    afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnChange();
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    DECLARE_MESSAGE_MAP()
};

核心函數實作

1. OnEraseBkgnd - 繪製背景圖


BOOL CMyEditCtrl::OnEraseBkgnd(CDC* pDC) {
    BITMAP bm; m_bmp.GetBitmap(&bm);
    m_pbmCurrent = &m_bmp;

    CDC memDC; memDC.CreateCompatibleDC(pDC);
    CBitmap* pOld = memDC.SelectObject(m_pbmCurrent);
    pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(pOld);
    return TRUE; // 告訴系統背景已處理,不再預設填滿
}

2. CtlColor - 透明文字模式


HBRUSH CMyEditCtrl::CtlColor(CDC* pDC, UINT nCtlColor) {
    pDC->SetBkMode(TRANSPARENT);           // 關鍵:透明背景模式
    pDC->SetTextColor(RGB(255,255,255));   // 白色文字 (依背景調整)
    return m_brHollow;                     // 回傳空心筆刷
}

建構子中需初始化 m_brHollow.CreateStockObject(HOLLOW_BRUSH)。

3. OnChange - 內容變更強制重繪


void CMyEditCtrl::OnChange() {
    Invalidate(); // 強制觸發 WM_PAINT -> OnEraseBkgnd -> 重繪背景+文字
}

4. OnLButtonUp - 滑鼠選取後重繪


void CMyEditCtrl::OnLButtonUp(UINT nFlags, CPoint point) {
    Invalidate(); // 解決選取反白後背景不更新問題
    CEdit::OnLButtonUp(nFlags, point);
}

動態切換背景圖


void CMyEditCtrl::SetBackgroundBitmap(UINT nResourceID) {
    m_bmp.DeleteObject();
    m_bmp.LoadBitmap(nResourceID);
    Invalidate(); // 立即更新
}

使用方式

  1. 資源編輯器加入位圖資源 (建議尺寸等於 Edit 控制項大小)。
  2. 對話框編輯器放入 Edit 控制項,屬性設為「多行」、「垂直捲動」、「想要的字型」。
  3. ClassWizard 新增類別 CMyEditCtrl 基於 CEdit,加入成員變數關聯控制項。
  4. 在對話框 OnInitDialog 中:m_MyEdit.SetBackgroundBitmap(IDB_MYBACKGROUND)。

注意事項與優化方向

  • 背景圖尺寸若與控制項不符,需在 OnEraseBkgnd 使用 StretchBlt 縮放或平鋪。
  • 文字顏色固定白色,實際專案建議加入 SetTextColor 方法依背景亮度自動調整。
  • 大量文字輸入時 Invalidate 可能導致閃爍,可改用雙緩衝或僅更新變更區域 (InvalidateRect)。
  • 同樣原理可套用至 CListBox、CComboBox、CTreeCtrl 等控制項。

總結

透過 OnEraseBkgnd 繪製背景 + CtlColor 透明文字 + 關鍵事件強制重繪,即可讓標準 Edit 控制項擁有豐富視覺效果,技術成熟穩定,廣泛應用於皮膚化介面開發。

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