有没有办法在 MFC (2005) 中更改 MDIParent 窗口的背景颜色?
我曾尝试拦截 ON_WM_CTLCOLOR 和 ON_WM_ERASEBKGND 但均无效。OnEraseBkgnd 确实有效,但随后会被标准 WM_CTL 颜色覆盖。
干杯
有没有办法在 MFC (2005) 中更改 MDIParent 窗口的背景颜色?
我曾尝试拦截 ON_WM_CTLCOLOR 和 ON_WM_ERASEBKGND 但均无效。OnEraseBkgnd 确实有效,但随后会被标准 WM_CTL 颜色覆盖。
干杯
创建一个派生 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 中,调用基类,然后使 invalidate 强制重绘:
CWnd::OnSize(nType, cx, cy);
Invalidate(FALSE);
在您的大型机中,声明一个成员 CClientWnd(例如 m_clientWnd)
在你的大型机的 OnCreate 中,首先调用超类,然后
m_clientWnd.SubclassWindow(m_hWndMDIClient);
CMDIFrameWnd 实际上被另一个称为 MDIClient 窗口的窗口所覆盖。这是一篇关于如何子类化此 MDIClient 窗口并更改背景颜色的 Microsoft 文章。我自己试过了,效果很好。
至少在 VS2008 中似乎有一个简单的解决方案:
在
CMainFrame::OnPaint()
{
..
// 获取背景窗口的dc
CWnd* pWnd = CWnd::FromHandle(m_hWndMDIClient) ;
CPaintDC dc1(pWnd) ;
//然后在这个DC中绘制或bitblt
}
只是在这里猜测,但尝试处理 ON_WM_PAINT。