Microsoft KB Archive/173026

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

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</li></ul>

 Microsoft Visual C++, 32-bit Enterprise Edition 4.2</li></ul>

 Microsoft Visual C++, 32-bit Professional Edition 4.2</li></ul>

 Microsoft Visual C++, 32-bit Enterprise Edition 5.0</li></ul>

 Microsoft Visual C++, 32-bit Professional Edition 5.0</li></ul>

 Microsoft Visual C++, 32-bit Enterprise Edition 6.0</li></ul>

 Microsoft Visual C++, 32-bit Professional Edition 6.0</li></ul>

 Microsoft Visual C++, 32-bit Learning Edition 6.0</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q173026

<div class="symptoms_section">

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.

<div class="cause_section">

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

<div class="resolution_section">

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);

<div class="status_section">

STATUS
This behavior is by design.

<div class="moreinformation_section">

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

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© 2004 Microsoft Corporation. All rights reserved.