KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q117778: HOWTO: Change the Background Color of an MFC Edit Control

Article: Q117778
Product(s): Microsoft C Compiler
Version(s): 1.0,1.5,1.51,1.52,2.0,2.1,4.0,4.1,4.2,5.0,6.0
Operating System(s): 
Keyword(s): kbcode kbMFC KbUIDesign kbVC100 kbVC150 kbVC151 kbVC200 kbVC410 kbVC420 kbVC500 kbVC600
Last Modified: 13-MAY-2002

-------------------------------------------------------------------------------
The information in this article applies to:

- The Microsoft Foundation Classes (MFC), used with:
   - Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5, 1.51, 1.52 
   - Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0, 4.1 
   - Microsoft Visual C++, 32-bit Enterprise Edition, versions 4.2, 5.0, 6.0 
   - Microsoft Visual C++, 32-bit Professional Edition, versions 4.2, 5.0, 6.0 
   - Microsoft Visual C++, 32-bit Learning Edition, version 6.0 
   - Microsoft Visual C++.NET (2002) 
-------------------------------------------------------------------------------

SUMMARY
=======

To change the background color of an edit control in an MFC application, you
must override the OnCtlColor() message-handling function of the window
containing the edit control.

In the new OnCtlColor() function, set the background color and return a handle to
a brush that will be used for painting the background. This must be done in
response to receiving both the CTLCOLOR_EDIT and CTLCOLOR_MSGBOX messages in the
OnCtlColor() function.

This is also documented in the "Class Library Reference" under
CWnd::OnCtlColor().

MORE INFORMATION
================

The sample code below uses a CDialog-derived class to demonstrate the process.
Class Wizard was used to generate message-handling functions for the WM_CTLCOLOR
and WM_DESTROY messages. These functions are called CEditDialog::OnCtlColor()
and CEditDialog::OnDestroy(), respectively.

NOTE: In Visual C++ .NET you can add the WM_CTLCOLOR and WM_DESTROY handlers for
the dialog object from the Properties Window. All the available messages for the
dialog are listed in the Messages tab.

Sample Code
-----------

        // editdlg.h : header file
        // 

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

        class CEditDialog : public CDialog
        {
        // Construction
        public:
            CEditDialog(CWnd* pParent = NULL);    // standard constructor

        // Add a CBrush* to store the new background brush for 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 support
        //}}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:
                // Set color to green on black and return the background
                   brush.
                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();

            // Free the space allocated for the background brush
            delete m_pEditBkBrush;
        }

Additional query words: CEdit

======================================================================
Keywords          : kbcode kbMFC KbUIDesign kbVC100 kbVC150 kbVC151 kbVC200 kbVC410 kbVC420 kbVC500 kbVC600 kbGrpDSMFCATL 
Technology        : kbAudDeveloper kbMFC
Version           : :1.0,1.5,1.51,1.52,2.0,2.1,4.0,4.1,4.2,5.0,6.0
Issue type        : kbhowto

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.