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

Last reviewed: August 25, 1997
Article 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
    

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 : MfcOLE
Technology : kbMfc kbole
Version : WINDOWS NT:4.0,4.0a,4.1,4.2,4.2b,5.0
Platform : NT WINDOWS
Issue type : kbprb


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.

Last reviewed: August 25, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.