对CHtmlView滚动条事件进行捕捉,需要通过接收器接口,来接收HTML事件。以下测试示例,不能用于WEB标准的页面,否则取不到值。另一点,当页面刷新后,接收器将失效,试过重新挂接,报错,特定情况下不需要刷新的话,就用屏蔽页面刷新的方法。
1.新建基于CHtmlView的多文档程序,名称:TestHtmlView;
4.在CTestHtmlViewView头文件里,添加以下代码:
在CTestHtmlViewView实现文件里,添加以下代码:
5.在G盘创建一个HTML测试文件a.html,内容可以如下:
6.运行如下图所示:
1.新建基于CHtmlView的多文档程序,名称:TestHtmlView;
2.在"项目"菜单上选择"添加类"。在"添加类对话框",选择"MFC 类"。在"MFC 类向导",在"名称"页的在类基类上选择"CCmdTarget",类名为CMySink,然后在选择支持自动化,下选择"自动化"。如下图所示:
3.MySink.h代码如下:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
| // MySink.h : 头文件 #pragma once class CMySink : public CCmdTarget { DECLARE_DYNAMIC(CMySink) public: CMySink(CHtmlView *pParentHtmlView = NULL); virtual ~CMySink(); virtual void OnFinalRelease(); /** 捕获HTML滚动事件 */ void OnHtmlScroll(IHTMLEventObj *pEvtObj); protected: /** 父对象(CHtmlView指针) */ CHtmlView *m_pParentHtmlView; DECLARE_MESSAGE_MAP() DECLARE_DISPATCH_MAP() DECLARE_INTERFACE_MAP() }; |
MySink.cpp代码如下:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
| // MySink.cpp : 实现文件 #include "stdafx.h" #include "TestHtmlView.h" #include "MySink.h" #include <mshtmdid.h> IMPLEMENT_DYNAMIC(CMySink, CCmdTarget) CMySink::CMySink(CHtmlView *pParentHtmlView) { m_pParentHtmlView = pParentHtmlView; EnableAutomation(); } CMySink::~CMySink() { } void CMySink::OnFinalRelease() { CCmdTarget::OnFinalRelease(); } BEGIN_MESSAGE_MAP(CMySink, CCmdTarget) END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(CMySink, CCmdTarget) DISP_FUNCTION_ID(CMySink,"onscroll", DISPID_HTMLWINDOWEVENTS2_ONSCROLL, OnHtmlScroll, VT_EMPTY, VTS_DISPATCH) END_DISPATCH_MAP() BEGIN_INTERFACE_MAP(CMySink, CCmdTarget) INTERFACE_PART(CMySink, DIID_HTMLWindowEvents2, Dispatch) END_INTERFACE_MAP() void CMySink::OnHtmlScroll( IHTMLEventObj *pEvtObj ) { if (m_pParentHtmlView && m_pParentHtmlView->m_wndBrowser) { LPDISPATCH lpDispatch; lpDispatch = m_pParentHtmlView->GetHtmlDocument(); if (lpDispatch) { IHTMLDocument2 *pDocument2 = NULL; if (S_OK == lpDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDocument2)) { IHTMLElement *pElement = NULL; if (S_OK == pDocument2->get_body(&pElement)) { IHTMLTextContainer *pTextContainer = NULL; if (S_OK == pElement->QueryInterface(IID_IHTMLTextContainer, (LPVOID*)&pTextContainer)) { long scrollTop, scrollLeft; if (S_OK == pTextContainer->get_scrollTop(&scrollTop) && S_OK == pTextContainer->get_scrollLeft(&scrollLeft)) { TRACE("Top %ld Left %ld\r\n", scrollTop, scrollLeft); } pTextContainer->Release(); } pElement->Release(); } pDocument2->Release(); } lpDispatch->Release(); } } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 |
| #include "MySink.h" class CTestHtmlViewView : public CHtmlView { //... public: virtual void DocumentComplete(LPDISPATCH pDisp, VARIANT* URL); afx_msg void OnDestroy(); protected: CMySink *m_pSink; DWORD m_dwCookie; IHTMLWindow2 *m_pHTMLWindow2; BOOL IsMainFrame(LPDISPATCH pDisp); void SetHTMLWindow2Handler(); } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
| #include <afxctl.h> CTestHtmlViewView::CTestHtmlViewView() { m_pHTMLWindow2 = NULL; m_pSink = NULL; m_dwCookie = 0L; } void CTestHtmlViewView::OnInitialUpdate() { CHtmlView::OnInitialUpdate(); m_pSink = new CMySink(this); Navigate2(_T("g:\\a.html"), NULL, NULL); } void CTestHtmlViewView::OnDestroy() { if (m_pSink) { if (m_dwCookie) { AfxConnectionUnadvise(m_pHTMLWindow2, DIID_HTMLWindowEvents2, m_pSink->GetIDispatch(FALSE), FALSE, m_dwCookie); m_dwCookie = 0L; } if (m_pHTMLWindow2) { m_pHTMLWindow2->Release(); } delete m_pSink; TRACE("OnDestroy\r\n"); } CHtmlView::OnDestroy(); } void CTestHtmlViewView::DocumentComplete( LPDISPATCH pDisp, VARIANT* URL ) { UNUSED_ALWAYS(pDisp); ASSERT(V_VT(URL) == VT_BSTR); if (m_wndBrowser.m_hWnd && IsMainFrame(pDisp)) { TRACE("MainFrame DocumentComplete\r\n"); SetHTMLWindow2Handler(); } CString str(V_BSTR(URL)); OnDocumentComplete(str); } BOOL CTestHtmlViewView::IsMainFrame( LPDISPATCH pDisp ) { CComQIPtr<IWebBrowser2> spTempWebBrowser = pDisp; if (spTempWebBrowser && m_pBrowserApp && m_pBrowserApp.IsEqualObject(spTempWebBrowser)) return TRUE; return FALSE; } void CTestHtmlViewView::SetHTMLWindow2Handler() { LPDISPATCH pDisp = GetHtmlDocument(); if (pDisp) { IHTMLDocument2 *pDocument2 = NULL; if (S_OK == pDisp->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDocument2)) { if (m_pHTMLWindow2) { if (m_dwCookie) { AfxConnectionUnadvise(m_pHTMLWindow2, DIID_HTMLWindowEvents2, m_pSink->GetIDispatch(FALSE), FALSE, m_dwCookie); m_dwCookie = 0L; } m_pHTMLWindow2->Release(); m_pHTMLWindow2 = NULL; } if (S_OK == pDocument2->get_parentWindow(&m_pHTMLWindow2)) { AfxConnectionAdvise(m_pHTMLWindow2, DIID_HTMLWindowEvents2, m_pSink->GetIDispatch(FALSE), FALSE, &m_dwCookie); } pDocument2->Release(); } pDisp->Release(); } } |
1 2 3 4 5 6 7 8 |
| <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> <br/><br/><br/><br/>r<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/>r<br/><br/><br/><br/><br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> |
扩展资料:
1.绘制IE控件滚动条遇到点难题,200分求解
http://topic.csdn.net/u/20081024/12/b73acd31-b1dd-4938-89e4-909609253353.html
2.如何获得webBrowser控件滚动条滑块的位置问题补充
http://topic.csdn.net/u/20081027/14/274bec64-9c24-4375-9c3d-a7bb644844aa.html
3.如何访问WebBrowser的滚动条
http://www.wangchao.net.cn/bbsdetail_50534.html
4.The WebBrowser control Reference for C/C++ Developers
http://msdn.microsoft.com/en-us/library/aa752042.aspx
5.如何在基于 MFC 的 COM 客户端创建一个接收器接口
http://support.microsoft.com/kb/181845
6.如何接收 web 浏览器主机为 HTML 文档事件
http://support.microsoft.com/kb/Q246247
7.Handling HTML Element Events
http://msdn.microsoft.com/zh-sg/library/bb508508.aspx
8.CHtmlView
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MaeulNo=20&no=61284&ref=61268