捕获CHtmlView的滚动条事件

对CHtmlView滚动条事件进行捕捉,需要通过接收器接口,来接收HTML事件。以下测试示例,不能用于WEB标准的页面,否则取不到值。另一点,当页面刷新后,接收器将失效,试过重新挂接,报错,特定情况下不需要刷新的话,就用屏蔽页面刷新的方法。
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(); 
        } 
    } 
4.在CTestHtmlViewView头文件里,添加以下代码:
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(); 
在CTestHtmlViewView实现文件里,添加以下代码:
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(); 
    } 
5.在G盘创建一个HTML测试文件a.html,内容可以如下:
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/> 
6.运行如下图所示:

扩展资料:
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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值