Как изменить цвет фона окна в 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), проделайте следующие шаги, используя визард:

  1. При помощи ClassWizard создайте универсальный класс CWnd.
  2. В классе CMainFrame создайте переменную-челен типа CWnd из пункта 1.
  3. В функции 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.

  4. Всякий раз, когда делается сабклассинг окна, то должна быть переопределена функция 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).

  5. Переопределите сообщение WM_ERASEBKGND для универсального класса CWnd, используя код, приведённый выше.

Чтобы изменить фоновый цвет объекта CFormView, можно обработать сообщение WM_ERASEBKGND и использовать код, приведённый выше, либо обработать сообщение WM_CTLCOLOR.

 
« Предыдущая статья   Следующая статья »