BOOL CMyApp::InitInstance() {
// 必須在 DoModal() 之前呼叫
SetDialogBkColor(RGB(0,0,255), RGB(255,0,0)); // 藍底紅字
CMyDlg dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
return FALSE;
}
void CMyDlg::OnPaint() {
if (IsIconic()) {
CDialog::OnPaint();
return;
}
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.FillSolidRect(rect, RGB(0,255,0)); // 綠底
CDialog::OnPaint(); // 繪製子控制項
}
步驟:
CBrush m_brush;OnInitDialog 建立筆刷:m_brush.CreateSolidBrush(RGB(0,255,0));OnCtlColor:
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
// 不呼叫基類實作
return m_brush; // 所有控制項、對話框背景統一綠色
}
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // 保留預設行為
if (nCtlColor == CTLCOLOR_DLG) // 僅對話框本體
return m_brush;
return hbr; // 其他控制項維持系統預設
}
| 方法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| SetDialogBkColor | 全域統一風格 | 最簡單 | 無法單獨控制 |
| OnPaint | 自訂繪圖、漸層背景 | 彈性高 | 需自管子控制項重繪 |
| OnCtlColor (無判斷) | 快速測試 | 代碼極少 | 影響所有子控制項 |
| OnCtlColor (判斷 CTLCOLOR_DLG) | 正式專案 | 精確控制、規範 | 稍多幾行代碼 |
OnPaint 或 OnEraseBkgnd 中繪製。WM_CTLCOLOR 可同時自訂子控制項文字/背景色。OnDestroy 釋放 CBrush(或讓成員變數自動釋放)。