在 OnEraseBkgnd 中嘗試用傳入的 CDC* pDC 繪製背景色,但畫面未如預期顯示指定顏色;改用 CClientDC 則正常。程式碼片段:
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetWindowRect(&rect); // 錯誤:取得螢幕座標
pDC->SelectObject(&brush);
pDC->Rectangle(rect);
return CDialogEx::OnEraseBkgnd(pDC);
}
GetWindowRect 回傳螢幕絕對座標,但 pDC 的裝置座標系是客戶區左上角為 (0,0)。應改用 GetClientRect。SelectObject 回傳舊物件指標,繪製完畢需還原,否則資源洩漏。TRUE 表示已自行處理,不再呼叫基底。BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(&rect); // 取得客戶區矩形
CBrush* pOldBrush = pDC->SelectObject(&m_brush); // m_brush 為成員變數 CBrush
pDC->Rectangle(&rect);
pDC->SelectObject(pOldBrush); // 還原舊刷子
return TRUE; // 已自行處理背景清除,不需呼叫基底類別
}
m_brush 應在建構子或 OnInitDialog 中建立:m_brush.CreateSolidBrush(RGB(0, 128, 255));OnPaint 中繪製,並回傳 TRUE 於 OnEraseBkgnd 避免閃爍。CClientDC、CPaintDC、傳入的 CDC* 本質相同,差別在建立時機與壽命,核心繪圖功能一致。掌握座標系轉換與 DC 物件管理,即能正確控制 MFC 對話方塊背景繪製。