Чтобы изменить цвет фона 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; } |