Как изменить цвет фона 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;
 
« Предыдущая статья   Следующая статья »