电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> C++/VC>>webbrowser-Internet Explorer 5编程:

webbrowser-Internet Explorer 5编程

来源:www.cncfan.com | 2006-1-20 | (有7221人读过)

Internet Explorer 5编程 第一章

2001年5月26日

Internet Explorer 5编程

本站原创:KKnD

前言:
在很久很久以前,写一个浏览器可是一个有一定劳动量的工程,您必须是精通多种技术的
专家,包括通信、COM、C++、Internet标准和协议以及安全性等等。然而这一切
都因为Internet Explorer 3.0及其后续版本的出现而变得简单易行,我这里将使用
Microsoft Visual C++6.0给大家讲解如何利用IE提供的控件接口来快速的进行
Internet Explorer(以下简称IE)编程。预计总共要分5~6章,看完后希望各位到**
发表一下意见。

第一章:先来点基础

现在由于IE的缘故,编写含有Web浏览功能的应用程序已经简单的令人几乎无法相信。IE
包含了一个了一个名为WebBrowser控件的组件,通过这个控件,您可以轻易的将Web
浏览功能整合到您的应用程序中,由此可以带来的许多方便我就不再赘述了。

WebBrowser控件包括许多不同的组件,其中大多数是COM对象,因此我们可以在程序
中重复使用它们,下面先看一个WebBrowser宿主应用程序[例如(其实就是)IE]的结构。
点击打开新窗口


由顶层开始,第一个组件是WebBrowser宿主,是您开发的任何一个使用WebBrowser
控件的程序。可以通过VB、VC或任何支持COM的开发工具来创建该程序。容器必须能够
掌管ActiveX控件,其余部分由WebBrowser控件来照管。其中WebBrowser控件既是
ActiveX控件也是Active Document宿主,即是说它既可以被任何一个ActiveX控件容
器所掌管也可以掌管其它Active控件,例如想加载.doc文件的话,WebBrowser控件就
会加载Microsoft Word。

shdocvw.dll(读作sh-doc-view)掌管WebBrowser控件(以及其他控件和COM对象),
并为宿主程序提供浏览功能,即使IE不直接掌管WebBrowser控件,IE也要使用
shdocvw,该组件可以使您在自己的应用程序中包含一些IE窗口特有的功能。

如果想加载HTML文件的话,WebBrowser控件会加载名为MSHTML的组件,该组件是
由mshtml.dll实现的。MSHTML是一个Active Document服务器,您可以将其加载在
作为Active Document宿主的应用程序中。同时它也可以掌管ActiveX控件(因为网页里
面可以插ActiveX控件,所以它是掌管ActiveX控件的控件 ^_^),还可以掌管其它组件
如:Active脚本编程引擎(VBScript和JScript)、Java Applet、Plug-in等很多东西
(不要觉得奇怪,因为这些东西在IE里都是作为ActiveX控件实现的)。

下面看到的是WebBrowser的接口结构和一些属性,WebBrowser是由四个接口组成,
其中三个提供了其所有的功能,所以现在只讲三个。在IE4之前只有两个接口,一个用于
WebBrowser控件(IWebBrowser),另一个用于IE对象(IWebBrowserApp)。
由于IWebBrowser和IWebBrowserApp具有很多相同的功能,所以在为IE4扩展
WebBrowser功能的时候,一个新的接口 -- IWebBrowser2被创建了。
它是从前两个接口中派生出来的,它们之间的具体结构关系见下图:
点击打开新窗口


IWebBrowser是最初唯一代表WebBrowser的接口,是其他所有WebBrowser接口
所派生的基本接口。它提供了基本的浏览功能如打开一个Web页面或在你的浏览记录里
“前进”或“后退”。由于IWebBrowser是由WebBrowser控件实现的,因此要给
应用程序添加Web浏览功能,所要做的全部工作就是使用IWebBrowser的方法和属性。

下表包括了IWebBrowser的8个方法和13个属性,以及它们的功能:

方法
说明

 GoBack
相当于IE的“后退”按钮,使你在当前历史列表中后退一项

 GoForward
相当于IE的“前进”按钮,使你在当前历史列表中前进一项

 GoHome
相当于IE的“主页”按钮,连接用户默认的主页

 GoSearch
相当于IE的“搜索”按钮,连接用户默认的搜索页面

 Navigate
连接到指定的URL

 Refresh
刷新当前页面

 Refresh2
同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表,
该表定义在ExDisp.h中,可以指定的不同值如下:
REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器
REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新
REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用
REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器

 Stop
相当于IE的“停止”按钮,停止当前页面及其内容的载入




属性
说明

 Application
如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,这个程序将返回WebBrowser
控件的自动化对象

 Parent
返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口

 Container
返回WebBrowser控件容器的自动化对象。通常该值与Parent属性返回的值相同

 Document
为活动的文档返回自动化对象。如果HTML当前正被显示在WebBrowser中,则
Document属性提供对DHTML Object Model的访问途径

 TopLevelContainer
返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true

 Type
返回已被WebBrowser控件加载的对象的类型。例如:如果加载.doc文件,就会返
回Microsoft Word Document

 Left
返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离

 Top
返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离

 Width
返回或设置WebBrowser窗口的宽度,以像素为单位

 Height
返回或设置WebBrowser窗口的高度,以像素为单位

 LocationName
返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源
是网页就是网页的标题;如果是文件或文件夹,就是文件或文件夹的名称

 LocationURL
返回WebBrowser当前正在显示的资源的URL

 Busy
返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true
就可以使用stop方法来撤销正在执行的访问操作


上面表中属性和方法都是是按vtable顺序列出的,在COM中,方法和属性在接口定义中的
顺序被称为vtable顺序。vtable是一个虚函数表,保存着指向由接口定义的方法和属性的
实际实现的指针。在vtable表中,基类接口的方法和属性位于派生类接口的方法和属性之前

好了,已经说了很多理论了,我们来点实际的,下面是第一个例子SimpleWebBrowser,它是一个在VC++6.0中掌管WebBrowser控件的最简单的例子:

首先用MFC AppWizard(exe)新建一个project,起名为SimpleWebBrowser,单击
OK,选择Single document,单击Finish结束。(图1)(图2)

然后是"Project"->"Add to Project"->"Components & Controls...",双击
"Registered ActiveX Controls",选择"Microsoft Web 浏览器",单击"Insert"
按钮,会弹出一个对话框,使用它的默认值(即单击OK)即可。(图3)(图4)
点击打开新窗口






在"SimpleWebBrowserView.h"中,即视图类中添加#include "WebBrowser2.h"
然后创建保护型数据成员,起名为m_WebBrowserCtrl,声明如下:
protected:
  CWebBrowser2 m_WebBrowserCtrl

然后再为视图类的WM_CREATE消息创建一个消息处理函数。在事件处理函数中添加代码
通过m_WebBrowserCtrl的Create方法创建新的WebBrowser控件实例。函数如下:
int CSimpleWebBrowserView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 if(!m_WebBrowserCtrl.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(),this,NULL))
   return -1;

 return 0;
}

接下来再为WM_SIZE添加处理函数,如果不添加这个处理函数,WebBrowser就会
“千呼万唤不出来,犹抱窗口全遮面”(搞笑搞笑...),下面是处理函数:
void CSimpleWebBrowserView::OnSize(UINT nType, int cx, int cy)
{
 CView::OnSize(nType, cx, cy);

 m_WebBrowserCtrl.MoveWindow(0,0,cx,cy);
 m_WebBrowserCtrl.UpdateWindow();
}

覆盖基类的OnInitialUpdate方法,使得该程序第一次创建时就连接到用户的主页:
void CSimpleWebBrowserView::OnInitialUpdate()
{
 CView::OnInitialUpdate();

 m_WebBrowserCtrl.GoHome();
}

编译运行:

点击打开新窗口



现在这个程序已经有点样子了,只是还缺一些基本功能例如前进、后退、打开URL等,
现在就用到了前面列出的那些方法了,我只示范性的添加一个“后退”功能,其它诸如
“前进”、“主页”、“停止”这样的功能可以照方儿添加。首先添加“导航”菜单,
再添加“后退”子菜单,设置ID为ID_GoBack,添加事件处理函数为:
void CSimpleWebBrowserView::OnGoBack()
{
 m_WebBrowserCtrl.GoBack();
}
这样就行了。

“打开URL”菜单项不能那么简单了,需要添加一个文本输入框或对话框来获取用户输入
的URL,我这里用的是添加一个对话框的方法。新建一个叫做INPUTUrl的对话框,添加
一个Edit Box,为它添加一个CString类型的变量,起名为m_url,覆盖对话框的
OnOK()函数,添加一句UpdateData(TRUE)。具体函数如下:
void INPUTUrl::OnOK()
{
 UpdateData(TRUE);
 CDialog::OnOK();
}

接下来回到SimpleWebBrowserView.cpp中,添加#include "INPUTUrl.h",用
资源编辑器在“导航”菜单下添加“打开URL”菜单项 ,设置该菜单项ID为ID_GoUrl,
添加事件处理函数为:
void CSimpleWebBrowserView::OnGoUrl()
{
 INPUTUrl dlgURL;
 if(dlgURL.DoModal()==IDOK)
 {
  CString strAddress=dlgURL.m_url;
  MessageBox(strAddress);
  if(!strAddress.IsEmpty())
  {
   COleVariant vtEmpty;
   m_WebBrowserCtrl.Navigate(strAddress,&vtEmpty,&vtEmpty,
      &vtEmpty,&vtEmpty);
  }
 }
}

这样第一个简单的程序就写完了,它拥有IE所拥有的基本功能,可以用来浏览网页。赶快
编译运行吧。怎么样?是不是很拉风?呵呵。

点击打开新窗口

第一章就先到此为止了。本文中的例子程序可以到VC的下载区中下载,VC++6.0
环境编译通过。






C++/VC热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2021 电脑爱好者 版权所有 备案号:鲁ICP备09059398号