PRB: Message-Handlers for ActiveX Control Aren't Called

ID: Q173026


The information in this article applies to:
  • The Microsoft Foundation Classes (MFC), included with:
    • Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.0a, 4.1, 4.2, 4.2b, 5.0, 6.0


SYMPTOMS

When you create an ActiveX control dynamically via CWnd::CreateControl(), your window's message-handlers in the CWnd-derived class will not be called. For example, if you create a handler for WM_KILLFOCUS [OnKillFocus()] in the CWnd-derived class of a Microsoft Masked Edit control, it will not be called.


CAUSE

CWnd::CreateControl() doesn't subclass the HWND associated with the control.


RESOLUTION

For message-handlers to be called, the CWnd-derived class needs to subclass the HWND. You can do this by calling SubclassDlgItem(). Calling SubclassDlgItem() right after CreateControl() will cause an assert because CreateControl() previously called CWnd::Attach(). SubclassDlgItem() will call Attach() again. To avoid this assert, we need to call Detach() first before calling SubclassDlgItem() as follows:


   // m_MaskEdit is the Microsoft Masked Edit control and 100 is
   // its resource ID.
   m_MaskEdit.Create("", WS_VISIBLE | WS_CHILD | WS_TABSTOP,
      CRect(0,0,100,25), this, 100);
   m_MaskEdit.Detach();
   m_MaskEdit.SubclassDlgItem(100, this); 


STATUS

This behavior is by design.


MORE INFORMATION

To set up a message handler for WM_KILLFOCUS in the CWnd-derived class of Microsoft Masked Edit control, you'll need to add the following lines to the header file:


   afx_msg void OnKillFocus(CWnd* pNewWnd);
   DECLARE_MESSAGE_MAP() 
The following lines go in the .CPP file:

   BEGIN_MESSAGE_MAP(CMSMask, CWnd)
      ON_WM_KILLFOCUS()
   END_MESSAGE_MAP()

   void CMSMask::OnKillFocus(CWnd* pNewWnd)
   {
      TRACE ("CMSMask::OnKillFocus\n");
   } 
When you insert an ActiveX control via Component Gallery, the Visual C++ wrapper class has Create() functions that end up calling CWnd::CreateControl().

Additional query words: ocx

Keywords : kbole kbMFC kbVC400 kbVC410 kbVC420 kbVC500 kbVC600
Version : WINDOWS NT:4.0,4.0a,4.1,4.2,4.2b,5.0,6.0
Platform : NT WINDOWS
Issue type : kbprb


Last Reviewed: August 8, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.