Есть ли способ изменить цвет фона для окон MDIParent в MFC (2005)?
Я пробовал перехватывать ON_WM_CTLCOLOR И ON_WM_ERASEBKGND, но ни одна из них не работает. OnEraseBkgnd действительно работает, но затем он перезаписывается стандартным цветом WM_CTL.
Ваше здоровье





Просто догадываюсь, но попробуйте обработать ON_WM_PAINT.
CMDIFrameWnd фактически закрывается другим окном, называемым окном MDIClient. Вот статья Microsoft о том, как создать подкласс этого окна MDIClient и изменить цвет фона. Я просто попробовал сам, и он отлично работает.
Создайте класс, производный от 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);
По крайней мере, в VS2008 есть простое решение этой проблемы:
В
CMainFrame :: OnPaint ()
{
..
// получаем dc фонового окна
CWnd * pWnd = CWnd :: FromHandle (m_hWndMDIClient);
CPaintDC dc1 (pWnd);
// а затем рисуем или bitblt в этом DC
}
чувак, разве я не дал реальный ответ, а не ссылку на ответ?