How to change the background color of an OLE control in Visual C++ (148242)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 4.1
    • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
    • Microsoft Visual C++, 32-bit Professional Edition 4.2
    • Microsoft Visual C++, 32-bit Professional Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 6.0
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET (2002)
    • Microsoft Visual C++ .NET (2003)

This article was previously published under Q148242
Note Microsoft Visual C++ .NET (2002) supports both the managed code model that is provided by the Microsoft .NET Framework and the unmanaged native Microsoft Windows code model. The information in this article applies only to unmanaged Visual C++ code.

SUMMARY

This article describes how to modify the background color of an OLE control that subclasses a Windows Control. Sample code for an Edit control is provided.

This article also applies to Button, Static, ListBox, and ComboBox controls.

MORE INFORMATION

For more information about the exact WM_CTLCOLORxxx message that is sent by each control, click the following article number to view the article in the Microsoft Knowledge Base:

130952 WM_CTLCOLORxxx message changes

If a control sends the WM_CTLCOLORSTATIC, you have to handle the OCM_CTLCOLORSTATIC message in the OCX and so on.

To change the background color of an OLE Control that subclasses an Edit Control, you must handle the OCM_CTLCOLOREDIT(32-bit) messages. These messages are intercepted by the "reflector window" (created for an OLE control that subclasses a Windows control) that reflects them back to the OLE control itself. In response to these reflected messages, you must set the background color (and optionally the foreground color) and return a handle to a brush initialized with the background color.

Step-by-Step Example

  1. Generate an MFC ActiveX Control Wizard Application, and select the option that allows you to subclass an Edit control.
  2. To handle an OCM_CTLCOLOREDIT reflected window message, declare the following handler function in the .h file of your control's class:
    LRESULT OnOcmCtlColor(WPARAM wParam, LPARAM lParam);
    					
  3. In the .cpp file of your control's class, add an ON_MESSAGE entry to the message map:
    ON_MESSAGE(OCM_CTLCOLOREDIT, OnOcmCtlColor)
    					
  4. Declare CBrush* m_pBackBrush in your control's .h file.
  5. Set m_pBackBrush to NULL in the constructor.
  6. Release the GDI object and delete the brush object in the control destructor:
    CEdtclrCtrl::~CEdtclrCtrl()
        {
           if(m_pBackBrush!=NULL)
    	{
               m_pBackBrush->DeleteObject();
               delete m_pBackBrush;
    	}
        }
    					

REFERENCES

Refer to technical article "TN062: Message Reflection for Windows Controls" and the article "ActiveX Controls: Sub-classing a Windows Control in Visual C++ Programmer's Guide."

Modification Type:MajorLast Reviewed:5/31/2005
Keywords:kbinfo kbcode kbCtrl kbhowto KB148242 kbAudDeveloper