VS2010 WEBBROWSER控件探索(一)

最近研究如何在可视化程序中进行网络操作,对已有网页进行些许控制,发现webbrowser控件是一个不错的选择,于是开始动手

一:   首先新建一个MFC对话框程序,添加webbrowser控件,其过程是在工具箱中右击,点击选择项按钮


    然后在COM组件中选择Microsoft  Web browser控件即可


这样工具箱中就有了webbrowser 控件,将其拖放在对话框程序中即可,并生成了explorer1.h和explorer1.cpp文件

二:现在开始对webbrowser控件进行操作

        添加一个按钮进行事件触发,

void CVS_ONLINE_PAGEDlg::OnBnClickedTest()
{
	//测试使用函数	
	m_ie.Navigate2(COleVariant(L"http://www.trovigo.com/?ctid=CT3314958&octid=EB_ORIGINAL_CTID&SearchSource=55&CUI=&UM=2&UP=SP6345EA24-9871-452D-AACB-5426C0BE3743&SSPV="),NULL,NULL,NULL,NULL);//get_Document函数必须在网页加载完成之后使用,也就是说不能直接在Navigate2之后使用!!!!!!!!!!!!!!!
}
这样我们就可以浏览一个网页了,但是对于网页中内容进行操作,则必须在网页加载完成之后进行, 不能调用Navigate2之后,直接进行,这样的操作是无效的!  

三:为webbrowser控件添加事件触发处理程序,比如文档加载完成之后,进行某些操作,有两种方式,一是利用向导来进行的

 并选择相应的事件进行处理


这样就添加了事件处理过程可以做自己想要的操作,实例如下:



void CExplorer1::DocumentCompleteExplorer1(LPDISPATCH pIDisp, VARIANT* URL)
{
IWebBrowser2* pWb;
IHTMLDocument2* pDoc=NULL;
IDispatch* pDis;
HRESULT hr=pIDisp->QueryInterface(IID_IWebBrowser2,(void**)&pWb);
hr=pWb->get_Document(&pDis);
hr=pDis->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
if(SUCCEEDED(hr))
{
long lCount=0;
IHTMLElementCollection*pCollection=NULL;
pDoc->get_all(&pCollection);
pCollection->get_length(&lCount);
for(long i=0;i<lCount;i++)
{
IHTMLElement*pElement=NULL;
VARIANT vItem;
vItem.vt=VT_I4;
vItem.intVal=i;
pCollection->item(vItem,CComVariant(),&pIDisp);
hr=pIDisp->QueryInterface(IID_IHTMLElement,(void**)&pElement);
if(SUCCEEDED(hr))
{
//设置编辑框内容
BSTR bstrId;
pElement->get_id(&bstrId);
if(bstrId!=NULL)
{
if(wcsstr(bstrId,L"q_top"))
{
pElement->put_innerText(L"DSADA");
MessageBox(L"找到编辑框了",L"提示",0);
}
}
//模拟点击按钮

pElement->get_id(&bstrId);
if(bstrId!=NULL)
{
if(wcscmp(bstrId,L"button")==0)
{
MessageBox(L"找到按钮了",L"提示",0);
pElement->click();
}
}

pElement->Release();
}
pIDisp->Release();
}
pIDisp->Release();
}

}

或者也可以进行手动操作,只是该方法是在Dlg中进行的

3.1首先在Dlg.h文件中添加声明 DECLARE_EVENTSINK_MAP()

3.2在Dlg.cpp文件中添加EVENT宏BEGIN_EVENTSINK_MAP(CVS_ONLINE_PAGEDlg, CDialog)
{{AFX_EVENTSINK_MAP(CMFCHtmlDlg)
ON_EVENT(CVS_ONLINE_PAGEDlg, IDC_EXPLORER1, 259 /* DocumentComplete */, OnDocumentCompleteExplorerMain, VTS_DISPATCH VTS_PVARIANT)
}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

3.3添加事件处理函数

void CVS_ONLINE_PAGEDlg::OnDocumentCompleteExplorerMain(LPDISPATCH pDisp, VARIANT FAR* URL) 
{
	// TODO: Add your control notification handler code here
	HRESULT hr=0;
	IDispatch*				pIDisp			= NULL;
	pIDisp = m_ie.get_Document();
	IHTMLDocument2* pDoc=NULL;
	hr=pIDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
	if(SUCCEEDED(hr))
	{
		long lCount=0;
		IHTMLElementCollection*pCollection=NULL;
		pDoc->get_all(&pCollection);
		pCollection->get_length(&lCount);
		for(long i=0;i<lCount;i++)
		{
			IHTMLElement*pElement=NULL;
			VARIANT vItem;
			vItem.vt=VT_I4;
			vItem.intVal=i;
			pCollection->item(vItem,CComVariant(),&pIDisp);
			hr=pIDisp->QueryInterface(IID_IHTMLElement,(void**)&pElement);
			if(SUCCEEDED(hr))
			{
				//设置编辑框内容
				BSTR bstrId;
				pElement->get_id(&bstrId);
				if(bstrId!=NULL)
				{
					if(wcsstr(bstrId,L"q_top"))
					{
						pElement->put_innerText(L"DSADA");
						MessageBox(L"找到编辑框了",L"提示",0);
					}					
				}
				//模拟点击按钮
				
				pElement->get_id(&bstrId);
				if(bstrId!=NULL)
				{
					if(wcscmp(bstrId,L"button")==0)
					{
						MessageBox(L"找到按钮了",L"提示",0);
						pElement->click();
					}
				}
				
				pElement->Release();
			}
			pIDisp->Release();
		}
		pIDisp->Release();
	}

}

这样基本过程就已经完了,现在说下原理,其实利用向导,和手动是一样的,只是宏过程的添加有程序来完成,

DECLARE_EVENTSINK_MAP宏

使用DECLARE_EVENTSINK_MAP宏在类声明的末尾处,然后在定义.cpp文件该成员为类函数,使用BEGIN_EVENTSINK_MAP宏,将通知每个项
的宏,事件,并声明接收器末尾的END_EVENTSINK_MAP宏的列表
BEGIN_EVENTSINK_MAP(CExplorer1, CWnd)//第二个是基类名称


ON_EVENT(theClass,id,dispid,pfnHandler,vtsParam)
END_EVENTSINK_MAP()


theClass此事件接收器所映射所属的类
id  OLE控件的ID
dispid 激发控件事件处理函数的消息ID
pfnHandler 对该dispid事件处理的函数
vtsParam为时间指定参数序列

到此完成!

笔者觉得对于事件处理函数应该是在explorer.cpp或者说在CExplorer类中进行编辑,这样是符合软件工程原则的,具有较好的耦合性?

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值