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
环境编译通过。