15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как изменить цвет фона окна в 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.