2008-10-14 307 views
2

有沒有辦法改變MFC(2005)中MDIParent窗口的背景顏色?設置背景顏色CMDIFrameWnd

我試着攔截了ON_WM_CTLCOLOR和ON_WM_ERASEBKGND,但都沒有工作。 OnEraseBkgnd可以工作,但它會被標準的WM_CTL顏色覆蓋。

乾杯

+0

花花公子繪製或塊傳送,沒有我給實際的答案,而不是答案的鏈接? – 2008-10-15 00:21:40

回答

3

CMDIFrameWnd實際上被稱爲MDIClient窗口的另一個窗口覆蓋。這是一篇關於如何繼承這個MDIClient窗口並更改背景顏色的Microsoft文章。我自己試了一下,效果很好。

http://support.microsoft.com/kb/129471

0

只是猜測在這裏,但嘗試處理ON_WM_PAINT。

3

創建一個類派生的CWnd(CClientWnd例如)

在您的CWnd派生類手柄

afx_msg BOOL OnEraseBkgnd(CDC* pDC); 
afx_msg void OnPaint(void); 
afx_msg void OnSize(UINT nType, int cx, int cy); 

您需要以下消息映射條目:

ON_WM_ERASEBKGND() 
ON_WM_PAINT() 
ON_WM_SIZE() 

在OnEraseBkgnd中只返回TRUE,你會完成所有的在OnPaint的工作

在OnPaint中,做任何你喜歡的事情。要填充顏色,你可以做

CBrush brush; 
brush.CreateSolidBrush(COLORREF(RGB(80, 160, 240))); 

CRect clientRect; 
GetClientRect(clientRect); 

CPaintDC dc(this); 
dc.FillRect(clientRect, &brush); 

在OnSize中調用超類,然後無效以強制重繪。


在大型機,聲明一個成員CClientWnd(m_clientWnd例如)

在您的主機的OnCreate,首先調用父類的,然後

m_clientWnd.SubclassWindow(m_hWndMDIClient); 
1

似乎有一個簡單的解決方案這個問題在VS2008中至少有:

的CMainFrame :: OnPaint中()

{

..

//獲取背景窗口

的CWnd * PWND = CWnd的:: FromHandle(m_hWndMDIClient)的直流;

CPaintDC dc1(pWnd);

//然後在這個DC

}