Microsoft KB Archive/173026

From BetaArchive Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Knowledge Base


PSS ID Number: 173026

Article Last Modified on 12/1/2003



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.0a
    • Microsoft Visual C++, 32-bit Editions 4.1
    • Microsoft Visual C++, 32-bit Editions 4.2b
    • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
    • Microsoft Visual C++, 32-bit Professional Edition 4.2
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 5.0
    • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
    • Microsoft Visual C++, 32-bit Professional Edition 6.0
    • Microsoft Visual C++, 32-bit Learning Edition 6.0



This article was previously published under Q173026

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: kbprb KB173026
Technology: kbAudDeveloper kbMFC kbVC32bitSearch kbVC400 kbVC400a kbVC410 kbVC420 kbVC420b kbVC500 kbVC500Search kbVC600 kbVCsearch