Handling HTML Element Events in MFC applications - A simple alternative approach
2008-08-24 22:43
393 查看
Introduction
The conventional approach to sink events when hosting a WebBrowser control involves using the MSHTML ElementEvents2Interface. It requires retrieving a pointer to the element of interest of the page, retrieving a pointer to the connection point container, finding the required connection point, advising the connection point to start receiving events,
implementing
IDispatch::Invoketo handle any fired event and closing the connections when no longer needed.
This article illustrates a simple alternative technique to intercept and handle, in a MFC application, HTML element events generated in a hosted WebBrowser Control. It also shows how to use xml objects to pack event information to the hosting application,
and how to extract this information to implement an event handler.
Implementation
Before navigation occurs in a WebBrowser control, a BeforeNavigate2 message is fired. VC++ 6.0 MFC Class Wizard, automatically adds the appropriate OnBeforeNavigate2 member function to handle this event.Two of the six parameters taken by
OnBeforeNavigate2, are useful to intercept DHTML events:
VARIANT FAR* URLthat contains the url address to be navigated to, and
BOOL FAR* Cancel, that cancels navigation before it occurs.
In a WebBrowser's HTML page, the VBScript property
location.hrefof the browser
document's object, sets the entire URL as a string. When a given URL is set in the HTML script event handler, the corresponding string is passed as the second parameter of the member function
OnBeforeNavigate2of the hosting application.
In order to intercept and handle HTML element events, the
hrefproperty should contain, instead of a regular URL address, a string with the necessary information of the DHTML event fired in the Browser control.
In most cases, the information required by the hosting application consists of the html element's id , and an associated value. This information is packed in a xml string having the form
"<element idevent='001'>value</element>".
Once this value is passed to
OnBeforeNavigate2, the parameter
Cancelis set to TRUE to avoid navigation. The following two code snippets illustrate these ideas.
<SCRIPT ID = "clientEventHandlersVBS" LANGUAGE="VBScript"> <!-- dim strIndex Sub myelement_onmouseover() strIndex = "007" strXML = "<element idevent='" & strIndex & "'>" &_ myelement.innerText & "</element>" location.href = "Event:" & strXML End Sub --> </SCRIPT>
// OnBeforeNavigate2 Event handler void CDlgDHTMLEventsDlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel) { CString strURL(URL->bstrVal); CString strXML(strURL.Right(strURL.GetLength()-6)); strXML.Replace("%20", " "); if(strURL == _T("about:blank")) *Cancel = FALSE; else { ExtractXMLInfo(strXML); *Cancel = TRUE; } }
The sample application
dlgDHTMLEvents is a dialog based MFC application. The dialog hosts a WebBrowser control that shows a HTML page having these DHTML objects: two INPUT elements, two BUTTONS, one <h1> text element and one IMAGE object. When some predetermined events are firedby each one of these elements, its id and associated value are passed to the MFC dialog app.
Since xml is used to convey DHTML event information, the Microsoft XML parser should be imported into the MFC project. To do it, add this line to StdAfx.h (If not installed, it can be downloaded from
http://www.msdn.microsoft.com/downloads/default.asp ):
#import "Msxml3.dll" named_guids raw_interfaces_only
To add ATL support (
CComBSTRtypes are used), include this header file in StdAfx.h:
#include <atlbase.h>
The HTML script is stored as a resource of the project (ID: IDR_HTML). The script's event handlers are included in the section <SCRIPT ID = "clientEventHandlersVBS" LANGUAGE="VBScript">of this resource.
The page is loaded into the Browser using the
IPersistStreamInitinterface and associated methods, of the
CWebBrowser2class. The member function
LoadHTMLPage(CString strBaseAddress)implements this operation. The strBaseAddress parameter sets the
baseline URL for the graphical resources used in the HTML page.
The member variable
m_strBaseAddresscontains this parameter. In the sample application, this value is set, in the dialog constructor, to _T("c://dlgDHTMLEvents//res"). Please modify according to your path.
Before a pointer to
IPersistStreamInitcan be obtained, Mshtml.dll has to be loaded (MSHTML is the IE rendering engine and parser for HTML). For this reason, the initial navigation of the browser is set to the valid "about:blank"
URL.
LoadHTMLPage()is called from the event handler
OnDocumentComplete(), provided
m_bolLoadedis false.
The member function
ExtractXMLInfo(CString strXML)converts the string parameter strXML, received from the Web browser control, to a valid xml
MSXML2::IXMLDOMDocument* pxmlDocobject. To obtain a valid pointer to this interface,
CoCreateInstance()is called as follows:
hr = CoCreateInstance( MSXML2::CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, MSXML2::IID_IXMLDOMDocument, (void**)&pxmlDoc);
After obtaining this pointer, the parameter strXML, which has the form
_T("<element idevent='001'>value</element>"), is loaded and navigated to obtain the attribute node
MSXML2::IXMLDOMNode* pattrNode, and the value node
MSXML2::IXMLDOMNode* pNode. The event id and its associated value, are passed as parameters to the event handler function
EventHandler(INT nEvent, CString strValue).The static controls m_stcEvent and m_stcValue display in the dialog, the DHTML event description and the associated value.
In summary, the steps involved for intercepting and handling HTML events are:
Declare any desired event handlers in the HTML script.
In each event handler, set the
location.hrefproperty to the xml string that contains the values to be passed to the MFC host application.
Call the function that loads the HTML document stream from the event handler
OnDocumentComplete().
Implement
OnBeforeNavigate2().
Extract HTML element event information from the received xml string.
Use this information in the MFC event handler function.
With minor modifications, these steps can be used for applications that utilizes
CHtmlViewclasses.
License
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.A list of licenses authors might use can be found
here
About the Author
Leopoldo Peralta |
|
相关文章推荐
- 强大的文章必须转载保留 Handling HTML Element Events
- Handling HTML Element Events
- Keyboard messages/accelerators handling in MFC dialog based applications
- Layout Properties And Methods In Element, HTMLElement And Window
- Building Unicode applications in MFC(转载)
- Synchronization in Multithreaded Applications with MFC
- How to create MFC applications that do not have a menu bar in Visual C++(MFC单文档和多文档程序中去掉菜单栏)(转)
- How to put a space character before option text in a HTML select element?
- Handling events in an MVVM WPF application
- HTML-多媒体页面(Alternative Inline Elements)
- How to Use MFC Tab Control in Developing VC++ Applications
- <html> vs. <body> element in css
- Handling Events in Windows
- Win32++: A Simple Alternative to MFC(界面 源码很强大)
- Events and event handling in C#
- Win32++: A Simple Alternative to MFC(界面 源码很强大)
- make the innerText in the html element can not be selected
- Events and event handling in C#
- 《Description of CWnd derived MFC objects and multithreaded applications in Visual C++》译文
- Event Handling Guide for iOS--(一)--About Events in iOS