小标
2018-07-13
来源 :
阅读 2329
评论 0
摘要:本文主要向大家介绍了如何用VC编程捕获CHtmlView的滚动条事件,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。
本文主要向大家介绍了如何用VC编程捕获CHtmlView的滚动条事件,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。
对CHtmlView滚动条事件进行捕捉,需要通过接收器接口,来接收HTML事件。以下测试示例,不能用于WEB标准的页面,否则取不到值。另一点,当页面刷新后,接收器将失效,试过重新挂接,报错,特定情况下不需要刷新的话,就用屏蔽页面刷新的方法。
1.新建基于CHtmlView的多文档程序,名称:TestHtmlView;
2.在"项目"菜单上选择"添加类"。在"添加类对话框",选择"MFC 类"。在"MFC 类向导",在"名称"页的在类基类上选择"CCmdTarget",类名为CMySink,然后在选择支持自动化,下选择"自动化"。
3.MySink.h代码如下:
// 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代码如下:
// 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头文件里,添加以下代码:
#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实现文件里,添加以下代码:
#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,内容可以如下:
<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.运行如下图所示:

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!
喜欢 | 1
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号