PRB: Tabbing Broken in WebBrowser Hosted in MFC Regular DLL (175502)
The information in this article applies to:
- Microsoft Internet Explorer (Programming) 3.0
- Microsoft Internet Explorer (Programming) 3.01
- Microsoft Internet Explorer (Programming) 3.02
- Microsoft Internet Explorer (Programming) 4.0
- 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
This article was previously published under Q175502 SYMPTOMS
When an application creates the WebBrowser control in an MFC Regular DLL,
tabbing within the WebBrowser control does not function correctly.
CAUSE
The TAB key and other dialog navigation keys are not getting processed in
the context of the DLL by the IsDialogMessage function. Consequently, the
proper dialog events are not being generated for the WebBrowser control.
RESOLUTION
In the DLL that is hosting the WebBrowser control, override the
PreTranslateMessage for the CWnd-derived class as follows:
BOOL CDllWnd::PreTranslateMessage(MSG* pMsg)
{
if (IsDialogMessage(pMsg))
return TRUE;
return CWnd::PreTranslateMessage(pMsg);
}
Next, export a function that can be used by a controlling application to
call PreTranslateMessage as follows:
extern "C" DllExport BOOL FAR PASCAL FilterDllMsg(LPMSG lpMsg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
TRY
{
return AfxGetApp()->PreTranslateMessage(lpMsg);
}
END_TRY
return FALSE;
}
In the controlling application, override the PreTranslateMessage method of
your CView-derived class and call the FilterDllMsg as follows:
BOOL CWBView::PreTranslateMessage(MSG* pMsg)
{
if (CView::PreTranslateMessage(pMsg))
return TRUE;
return FilterDllMsg(pMsg);
}
STATUS
This behavior is by design.
MORE INFORMATION
Typically, the Web Browser Control is embedded in a dialog box or CView-
derived class that resides as part of a standard application. When moving
WebBrowser control hosting code into an MFC Regular DLL, certain problems
related to messages may occur.
A MFC Regular DLL does not have a main message pump, as does the CWinApp
object of an application. When the DLL contains code that creates and hosts
the WebBrowser control, dialog messages are not automatically translated
for the WebBrowser control. If IsDialogMessage() is not called for these
messages by the DLL, the WebBrowser control will not properly handle
tabbing-related messages.
REFERENCES
For additional information, please see the following article in the
Microsoft Knowledge Base:
165074 PRB: Keystroke Problems in CView/CWnd Web Browser Control
The MFC sample that demonstrates this technique is called DLLTRACE and can
be found at:
Visual C++ Online Documentation: Developer Products; Visual C++; Visual C++
Samples; MFC Samples; Advanced MFC Samples; DLLTRACE
Modification Type: | Major | Last Reviewed: | 5/2/2001 |
---|
Keywords: | kbcode kbprb KB175502 |
---|
|