Как изменить цвет фона окна в MFC
Чтобы изменить цвет фона для объектов CView, CFrameWnd,
или CWnd, необходимо обработать сообщение WM_ERASEBKGND.
Пример, приведённый ниже, демонстрирует, как это
сделать.
Пример кода
BOOL CSampleView::OnEraseBkgnd(CDC* pDC)
{
// Устанавливаем цвет кисти, соответствующий цвету фона
CBrush backBrush(RGB(255, 128, 128));
// Записываем старую кисть
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect); // Стираем нужную область
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),
PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
Для изменения фонового цвета окна для CMDIFrameWnd,
необходимо создать подкласс (subclass) клиентского
окна в многодокументном интерфейсе (MDI) (окно в
клиентской области CMDIFrameWnd) и обработать
сообщение WM_ERASEBKGND. Более подробно о сабклассинге
окна MDICLIENT смотрите статью из Microsoft Knowledge Base:
Q129471 Сабклассинг (SubClass) MDIClient в MFC
Для изменения фонового цвета слиентского окна
MDI ( клиентская область CMDIFrameWnd), проделайте
следующие шаги, используя визард:
- При помощи ClassWizard создайте универсальный класс
CWnd.
- В классе CMainFrame создайте переменную-челен типа
CWnd из пункта 1.
- В функции OnCreate класса CMainFrame после вызова
базового класса CMDIFrameWnd::OnCreate(), добавьте вызов
SubclassWindow(). Например:
if (!m_wndNewClient.SubclassWindow(m_hWndMDIClient))
{
TRACE("Failed to subclass MDI client window\n");
return -1; // fail to create
}
m_hWndMDIClient это переменная-член CMDIFrameWnd которая
содержит дескриптор клиентского окна MDI. Так же,
замените "m_wndNewClient" той переменной, которую
Вы создали в пункте 2.
- Всякий раз, когда делается сабклассинг окна, то
должна быть переопределена функция GetSuperWndProcAddr()
член CWnd, чтобы обеспечить хранение адреса
процедуры старого окна. Для этого добавьте
следующую функцию в класс CWnd, созданный в пункте
1:
WNDPROC* CNewClientWnd::GetSuperWndProcAddr()
{
static WNDPROC NEAR pfnSuper = NULL;
return &pfnSuper;
}
ЗАМЕЧАНИЕ: Замените "CNewClientWnd" на имя Вашего
класса.
Информацию о сабклассинге окон при помощи MFC
можно посмотреть в следующих материалах:
- "Class Library Reference" для функций CWnd::SubclassWindow(),
CWnd::GetSuperWndProcAddr(), и CWnd::SubclassDlgItem()
- Поискать в Microsoft Knowledge Base по следующим ключевым
словам:
subclass and sample and mfc
- Посмотреть MFC пример CTRLTEST, который поставляется
с Visual C++ for Windows и Visual C++ 32-bit Edition.
- См. статью под названием "Subclassing Windows with the
Microsoft Foundation Class Library" на компакт диске Microsoft
Developer Network (MSDN).
- Переопределите сообщение WM_ERASEBKGND для
универсального класса CWnd, используя код,
приведённый выше.
Чтобы изменить фоновый цвет объекта CFormView,
можно обработать сообщение WM_ERASEBKGND и
использовать код, приведённый выше, либо
обработать сообщение WM_CTLCOLOR.
|