Настройка цвета фона CMDIFrameWnd - PullRequest
2 голосов
/ 14 октября 2008

Есть ли способ изменить цвет фона для окон MDIParent в MFC (2005)?

Я пытался перехватить ON_WM_CTLCOLOR и ON_WM_ERASEBKGND, но ни одна из них не работает. OnEraseBkgnd работает, но затем перезаписывается стандартным цветом WM_CTL.

Приветствия

Ответы [ 4 ]

3 голосов
/ 14 октября 2008

CMDIFrameWnd фактически закрыт другим окном, называемым окном MDIClient. Вот статья Microsoft о том, как создать подкласс этого окна MDIClient и изменить цвет фона. Я сам попробовал, и он отлично работает.

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

3 голосов
/ 14 октября 2008

Создать класс, наследующий 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 голос
/ 18 августа 2011

В VS2008 есть простое решение этой проблемы, по крайней мере:

В

CMainFrame :: OnPaint ()

{

..

// получаем постоянный ток фонового окна

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

CPaintDC dc1 (pWnd);

// и затем рисовать или битить в этом DC

}

0 голосов
/ 14 октября 2008

Просто угадайте здесь, но попробуйте обработать ON_WM_PAINT.

...