在《深入 MDI 用戶端視窗程式設計》一文中,胡擊先生分享了兩種修改 MDI 用戶端視窗背景的方法並給出了範例碼。本文在致敬作者鑽研精神的同時,提供另一種基於 VC6.0/5.0 MSDN 文件的標準實作方式,供開發者參考交流。
Windows 透過處理 WM_ERASEBKGND 訊息來實現視窗背景重繪。以下範例展示如何使用自定義畫筆繪製背景:
BOOL CSampleView::OnEraseBkgnd(CDC* pDC)
{
// 設定畫筆為所需背景色
CBrush backBrush(RGB(255, 128, 128));
// 保存舊畫筆
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect);
// 使用建立的畫筆填充背景區域
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
要改變 MDI 主視窗的用戶區背景,必須先將 MDI 用戶端子視窗進行子類化,再處理其 WM_ERASEBKGND 訊息。具體步驟如下:
CWnd 的視窗類別,命名為 CNewClientWnd。CMainFrame 中加入 CNewClientWnd 型別的成員變數 m_wndNewClient。CMainFrame::OnCreate 中,於呼叫基類 CMDIFrameWnd::OnCreate() 之後,加入子類化程式碼:if (!m_wndNewClient.SubclassWindow(m_hWndMDIClient))
{
TRACE("Failed to subclass MDI client window\n");
return -1; // 建立失敗
}
m_hWndMDIClient 是 CMDIFrameWnd 的成員變數,保存 MDI 用戶端視窗的控制代碼(注意:此變數在 MSDN 說明中可能找不到)。
CNewClientWnd 類別中,使用前述範例碼處理 WM_ERASEBKGND 訊息即可完成自定義背景繪製。此法遵循 Windows 標準訊息處理機制,結構清晰,易於維護擴展,是修改 MDI 用戶端視窗背景的推薦做法。