设置背景颜色CMDIFrameWnd

时间:2008-10-14 03:00:03

标签: c++ user-interface mfc colors

有没有办法在MFC(2005)中更改MDIParent窗口的背景颜色?

我试过拦截ON_WM_CTLCOLOR和ON_WM_ERASEBKGND,但都没有工作。 OnEraseBkgnd确实有效,但它会被标准的WM_CTL颜色覆盖。

干杯

4 个答案:

答案 0 :(得分:3)

CMDIFrameWnd实际上被另一个名为MDIClient窗口的窗口所掩盖。这是一篇关于如何子类化此MDIClient窗口并更改背景颜色的Microsoft文章。我自己尝试过,效果很好。

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

答案 1 :(得分: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);

答案 2 :(得分:1)

至少在VS2008中似乎有一个解决这个问题的简单方法:

的CMainFrame :: OnPaint()方法

{

...

//获取背景窗口的直流

CWnd * pWnd = CWnd :: FromHandle(m_hWndMDIClient);

CPaintDC dc1(pWnd);

//然后在此DC中绘制或bitblt

}

答案 3 :(得分:0)

在这里猜测,但尝试处理ON_WM_PAINT。