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

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


Как изменить цвет фона Edit Control в MFC

Чтобы изменить цвет фона edit control в приложении MFC, необходимо переопределить функцию-обработчик сообщения OnCtlColor() окна, содержащего edit control.

В новой функции OnCtlColor() устанавливается цвет фона и возвращается дескриптор кисти, которой будет закрашиваться фон. Это необходимо сделать в ответ на оба сообщения: CTLCOLOR_EDIT и CTLCOLOR_MSGBOX в функции OnCtlColor().

Данный способ так же описан в "Class Library Reference" - CWnd::OnCtlColor().

Приведённый ниже пример, использует класс, наследованный от CDialog, для демонстрации данного процесса. Для генерации функций-обработчиков для сообщений WM_CTLCOLOR и WM_DESTROY использовался Визард. Соответственно, будут вызываться функции CEditDialog::OnCtlColor() и CEditDialog::OnDestroy().

Пример кода

      // editdlg.h : header file
      // 

//////////////////////////////////////////////////////////////////////// 
      /// 
      // CEditDialog dialog

      class CEditDialog : public CDialog
      {
      // Construction
      public:
          CEditDialog(CWnd* pParent = NULL);    // стандартный конструктор

      // Добавляем CBrush* для хранения новой кисти фона edit controls.
          CBrush* m_pEditBkBrush;

      // Dialog Data
          //{{AFX_DATA(CEditDialog)
          enum { IDD = IDD_EDITDIALOG };
              // NOTE: The ClassWizard will add data members here.
          //}}AFX_DATA

      // Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CEditDialog)
      protected:
      virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
      //}}AFX_VIRTUAL

      // Implementation
         protected:

          // Generated message map functions
          //{{AFX_MSG(CEditDialog)
          afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
          afx_msg void OnDestroy();
          //}}AFX_MSG
          DECLARE_MESSAGE_MAP()
      };

      // editdlg.cpp : implementation file
      // 

      #include "stdafx.h"
      #include "mdi.h"
      #include "editdlg.h"

      #ifdef _DEBUG
      #undef THIS_FILE
      static char BASED_CODE THIS_FILE[] = __FILE__;
      #endif

   ////////////////////////////////////////////////////////////////////// 
      // CEditDialog dialog

      CEditDialog::CEditDialog(CWnd* pParent /*=NULL*/)
          : CDialog(CEditDialog::IDD, pParent)
      {
          //{{AFX_DATA_INIT(CEditDialog)
              // NOTE: The ClassWizard will add member initialization here.
          //}}AFX_DATA_INIT

          // Instantiate and initialize the background brush to black.
          m_pEditBkBrush = new CBrush(RGB(0, 0, 0));
      }

      void CEditDialog::DoDataExchange(CDataExchange* pDX)
      {
          CDialog::DoDataExchange(pDX);
          //{{AFX_DATA_MAP(CEditDialog)
              // NOTE: The ClassWizard will add DDX and DDV calls here.
          //}}AFX_DATA_MAP
      }

      BEGIN_MESSAGE_MAP(CEditDialog, CDialog)
          //{{AFX_MSG_MAP(CEditDialog)
          ON_WM_CTLCOLOR()
          ON_WM_DESTROY()
          //}}AFX_MSG_MAP
      END_MESSAGE_MAP()

////////////////////////////////////////////////////////////////////// 
      // CEditDialog message handlers

      HBRUSH CEditDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
      {
          switch (nCtlColor) {

          case CTLCOLOR_EDIT:
          case CTLCOLOR_MSGBOX:
              // Устанавливаем цвет зелёный на чёрном и возвращаем чёрную кисть.
              pDC->SetTextColor(RGB(0, 255, 0));
              pDC->SetBkColor(RGB(0, 0, 0));
              return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());

          default:
              return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
          }
      }

      void CEditDialog::OnDestroy()
      {
          CDialog::OnDestroy();

          // Освобождаем распределённое место для фоновой кисти
          delete m_pEditBkBrush;
      }