在北京工業大學計算機學院 胡擊先生的“深入MDI客戶窗口編程”一文中談到了其在學習過程中摸索出的兩種改變MDI客戶窗口背景的方法,並具體描述了其中一種實現方法,同時給出了示例代碼。我對作者這種孜孜不卷的學習態度表示欽佩,並同時提出自己在遇到同樣的情況時所采取的解決方法。
希望能夠互相學習、交流。
其實,VC6.0/5.0在其MSDN Library中已經對修改MDI主窗口的客戶區背景提供了方法,並給出了示例。
先介紹一下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主窗口的客戶區背景,我們還需要做一些額外的工作:要先Subclass MDI主窗口的客戶區子窗口,然後再處理WM_ERASEBKGND消息。
我們可以通過執行以下步驟來示范如何修改MDI主窗口的客戶區背景:
1.用ClassWizard創建一個基類為CWnd的窗口類,可以命名為CNewClientWnd。
2.在CMainFrame中添加類型為上一步創建的窗口類CNewClientWnd的成員變量,可以命名為m_wndNewClient。 3.在CMainFrame的成員函數OnCreate中,對基類CMDIFrameWnd::OnCreate()的調用之後,添加一條對SubClassWindow()的調用語句。
if (!m_wndNewClient.SubclassWindow(m_hWndMDIClient))
{
TRACE("Failed to subclass MDI client window\n");
return -1; // fail to create
}
m_hWndMDIClient是CMDIFrameWnd的成員變量,包含了MDI客戶窗口的句柄。
注意:(通過Help來查閱CMDIFrameWnd的成員變量,你是找不到m_hWndMDIClient的)
4.使用開始的示范代碼來處理第一步創建的窗口類CNewClientWnd的WM_ERASEBKGND消息。