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

MFC 對話框背景色設定導致 ComboBox 變黑,改用 Picture 控制項解決

     編輯:程式設計綜合問答

問題重現

在 MFC 對話框中:

  1. 設定對話框背景為位圖。
  2. 有一個 Static 控制項用於顯示影片,將其背景設為黑色(通常在 OnCtlColor 中處理)。
  3. 結果:對話框內所有 ComboBox 的下拉列表背景也變成黑色,導致文字難以閱讀。

根本原因

OnCtlColor 會針對對話框內所有子控制項被呼叫。若在處理 Static 控制項時直接回傳黑色筆刷,且未針對控制項類型/ID 進行判斷,其他控制項(如 ComboBox 的下拉列表也是以子視窗形式存在)同樣會套用此筆刷。

解決方案:改用 Picture Control

  1. 在資源編輯器中,將原本的 Static 控制項改為 Picture Control(圖片控制項),類型設為 Bitmap。
  2. 準備一張純黑色的位圖(或任意所需背景圖),指派給該 Picture Control。
  3. 移除 OnCtlColor 中針對該 Static 的特殊處理邏輯。

優點

  • 不影響其他控制項的預設繪製行為。
  • 維護簡單,無需在 OnCtlColor 撰寫複雜的控制項類型判斷邏輯。
  • 若未來需更換背景圖,只需替換位圖資源即可。

補充:若必須用 OnCtlColor

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    if (pWnd->GetDlgCtrlID() == IDC_MY_STATIC_VIDEO) { // 針對特定 ID
        pDC->SetBkColor(RGB(0,0,0));
        return (HBRUSH)GetStockObject(BLACK_BRUSH);
    }
    return hbr;
}

務必透過 GetDlgCtrlID() 精確識別目標控制項,避免誤傷其他控制項。

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