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