摘 要 本文介绍了 Microsoft 公司提供的 IE 控件,以及在应用程序中利用 IE 控件实现超文本浏览功能的两种方法。
关键词 IE控件,控件包容器,超文本,浏览
具有非线性表达方式的、符合人类认知模型的超文本模式,已成为文本库组织结构的主流。用户在开发自己的超文本库应用时,往往需要设计、实现风格独特、具有个性、与应用紧密结合的超文本浏览功能。利用 Visual C ++ 的集成开发环境及 IE 控件,可以很方便地在自己的应用程序中实现该功能。
1 IE控件简介
IE 控件是一组遵从 OLE 控件技术的可重用代码。OLE 控件是一个可重用组件,它支持广泛的 OLE 功能,除具有可移植性外,还允许控件暴露可以编程的属性和方法,以供控件用户调用。控件用户只需构造控件包容器就能够通过使用控件的属性和方法操纵控件,并接收从控件发出的通知消息,从而达到代码重用、加快和减化程序设计的目的。
IE 控件随 Microsoft 公司的 Internet Explorer3.x 以上的版本一同发行,只要完成该软件的安装,在 VisualC++4.0 的组件廊中就会有一个名为 Web Browser Control的控件,此即为 IE 控件,它是具有浏览器一般功能的可重用代码。IE 控件提供了可供应用程序访问的一些重要方法和事件,通过这些方法的访问,以及事件消息的触发,应用程序可以操纵 IE控件,实现超文本浏览功能。
1.1 IE 控件提供的方法
方法在使用和目的上与 C++ 类的成员函数相似。应用程序可以通过方法实现与控件的通讯。
。 BOOL Create(LPCTSTR lpszWindowName, DWORD dwtyle, const RECT& rect,CWnd * pParentWnd, UINT nID, CFile* pPersist=NULL, BOOL bStorage=FALSE, BSTR bstrLicKey=NULL)
该方法通过调用 CWnd 类的 CreateControl() 成员函数动态创建 IE 控件,作为一种特殊类型的子窗口被激活。第一个参数可设为 NULL,第二、三个参数用于指定子窗口的类型和大小,第四个参数是父窗口指针,第五个参数是在资源文件中定义的一个符号。
。 void Navigate(LPCTSTR URL, VARIANT * Flags, VARIANT * TargetFrameName, VARIANT
。 PostData, VARIANT * Headers)
该方法用于联向某个接点,并装入由 URL 指定的超文本页面。后四个参数可设为 NULL。
。 void GoBack()
返回上一级页面,与Internet Explorer 的GoBack对应。
。 void GoForward()
进入下一级页面,与Internet Explorer 的GoForward对应。
。 void Refresh()
重新装载当前页面,与Internet Explorer 的Refresh对应。
。 void Stop()
停止当前工作,与Internet Explorer 的Stop对应。
。 void GetLocationURL()
获取当前页面地址。
1.2 IE 控件提供的事件
事件是用来通知用户有关控件发生的事情,作为触发消息与应用程序进行交互。
。 FrameBeforeNavigate: 多栏式超文本页面被装入前触发。相应的激起函数为:
OnFrameBeforeNavigateExplorer1(LPCTSTR URL,long FLags, LPCTSTR
TargetFrameName, VARIANT FAR * PostData, LPCTSTR Headers, BOOL FAR * Cancel)
其中 URL 参数传递的是将要被装入的页面地址,TargetFrameName 参数是多栏式超文本的栏目名,Headers 参数是前一页面的地址。
。 BeforeNavigate:每次装入页面前被触发。相应的激起函数为:
OnBeforeNavigateExplorer1(LPCTSTR URL,long FLags, LPCTSTR TargetFrameName,
VARIANT FAR * PostData, LPCTSTR Headers, BOOL FAR * Cancel)
其中参数说明同前。
。 StatusTextChange:每次IE控件的操作状态改变时被触发。相应的激起函数为:
OnStatusTextChangeExplorer1(LPCTSTR Text)
其中Text参数传递的是当前操作命令。
。 TitleChange: 页面标题改变时被触发。相应的激起函数为:
OnTitleChangeExplorer1(LPCTSTR Text)
其中Text参数传递的是当前页面标题。
2 IE控件包容器的设计
创建使用 IE 控件的应用程序,也就是要设计实现一个 IE 控件包容器。IE 控件包容器就是完全支持 IE 控件,并能够把控件组合进自己的窗口或对话框的程序。控件包容器的实现通常有两种形式,一种是在对话框中使用 IE 控件,另一种是在窗口中使用 IE 控件。
2.1 对话框中使用 IE 控件
在对话框中使用 IE 控件,可设计实现一个基于对话框的应用,将 IE 控件嵌入在对话框的某个地方。该方法的实现可以完全依赖于 Visual C++ 4.0 提供的编程支持环境:AppWizard和组件廊,用户只需写入不多几行代码就可以将超文本浏览功能加入到自己的应用程序中。以下简单介绍程序开发的几个步骤,具体 AppWizard 和组件廊的使用,用户可参阅 Visual C++ 的随机帮助或有关资料。
步骤一:利用 AppWizard 创建一个基于对话框并支持 OLE Controls的应用。
步骤二:通过组件廊将IE控件插入到步骤一创建的应用中。
步骤三:将 IE 控件加入到对话框资源中,并定义控件变量。
步骤四:根据应用程序的需要,访问 IE 控件提供的方法,并响应 IE 控件在运行过程中激起的各种事件,以实现复杂程度各异的浏览功能。最简单的一种方法是,在对话框的初始化成员函数中加入对 IE 控件 Navigate 方法的调用,如:
m-web.Navigate( "http:www.cfets.sjz.cn", NULL, NULL, NUll, NULL)
即可实现一个浏览地址 www.cfets.sjz.cn 处超文本主页的浏览器,其中,m-web 是在对话框资源中定义的IE控件变量。
2.2 窗口中使用 IE 控件
所谓窗口中使用 IE 控件,即将 IE 控件以子窗口的形式加入到应用中,Visual C++ 4.0 没有提供象第一种方法那样便利的支持,程序员需要设计一些程序段。具体的程序设计过程如下:
步骤一:如果在使用 AppWizard 工具创建应用程序的过程中,没有选择支持 OLE Control选项,则需要手工在应用的 InitInstance() 的成员函数加入 AfxEnableControlContainer()函数调用,然后在 STDAFX.H 头文件中加入如下语句:#include <Afxdisp.h>。经过上述过程,应用程序则具备了对 IE 控件的支持,可以作为 IE 控件的包容器方便地使用 IE 控件的方法并与之交互。
步骤二:使用组件廊将 IE 控件加入到已创建的应用程序中,这一操作自动在工程文件中加入 webbrowser.h 和 webbrowser.cpp 两个文件。在需要加载 IE 控件的程序段的 .h 头文件中,加入 #include "webbrowser.h" 语句。
步骤三:在需要加载 IE 控件的程序段中,动态申请创建 IE 控件子窗口,使该子窗口获得控制程序运行的权利。动态创建 IE 控件子窗口,首先需要在装载该控件的程序段的 .h 头文件中,将 IE 控件包裹类 CWebBrowser 说明为内嵌对象,语句如下:
public:
CWebBrowser m-browser;
内嵌对象是在栈中被申请的。当需要将 IE 控件激活时,则需在程序的相应位置调用 IE 控件提供的方法 Create(),有关语句如下:
myrect.SetRect(1,50,635,475);
CWnd。 pParentWnd = FromHandle(m-hWnd);
m-browser.Create(NULL,WS-VISIBLE|WS-BORDER,myrect,
pParentWnd,IDC-EXPLORER1, NULL, FALSE, NULL);
步骤四:使用 IE 控件提供的方法,实现超文本浏览功能。首先调用 Navigate() 方法将超文本加载,然后使用 goback()、goforward() 等对超文本进行浏览过程的操纵,还可以通过响应IE 控件触发的事件,使应用程序得到目前 IE 控件的执行情况,例如,当超文本被加载浏览后,可以通过文本中定义的超链进行多文本之间的转换,这样,使得在应用程序中除了其主动加载的第一个超文本页面外,还存在有一些被链入的超文本页面,当应用程序需要获得当前正被浏览的超文本页面信息时,可通过响应 IE 控件触发的 OnBeforeNavigateExplorer1() 事件,由其传递的参数得到。
应用程序通过事件接收映象表 (Event Sink Map) 机制接收和响应 IE 控件触发事件,映象表为每一个需处理的事件指定了一个相应的处理函数。组成事件接收映象表的宏指令有:
DECLARE-EVENTSINK-MAP: 对事件映象表的声明
BEGIN-EVENTSINK-MAP: 事件映象表的起始语句
END-EVENTSINK-MAP: 事件映象表的终止语句
ON-EVENT:定义某一特定事件的处理函数入口
在具体的程序设计中,首先,需要在有关程序段的 .h 头文件中,加入该事件处理函数的说明,函数说明语句的前面需加 afx-msg 字段,如:
public:
afx-msg void OnTitleChangeExplorer1 (LPCTSTR Text);
再将 DECLARE-EVENTSINK-MAP() 宏指令加在该头文件末尾。其次,在相应的 .cpp 源文件中说明事件映象表,有关代码如下:
BEGIN-EVENTSINK-MAP(CMainFrame,
CFrameWnd)
//{{AFX-EVENTSINK-MAP(CMainFrame)
ON-EVENT(CMainFrame,IDC-EXPLORER1,113 /*TitleChange*/,
OnTitleChangeExplorer1,VTS-BSTR)
......
//}}AFX-EVENTSINK-MAP
END-EVENTSINK-MAP()
有关 ON-EVENT 宏指令的参数说明,读者可以参阅 Visual C++ 的联机帮助。映象表中定义的相应处理函数需要根据具体情况进行编写。例如:
void CMainFrame::OnTitleChangeExplorer1(LPCTSTR Text)
{
// TODO: Add your control notification handler code here
CString tmp-str;
tmp-str = Text;
......
}
步骤五:当应用程序不再使用 IE 控件时,调用 CWnd 类的 DestroyWindow() 成员函数关闭IE 控件子窗口。
3 必要的说明
笔者在具体项目的开发中,设计实现的是一个不带文档和视结构的应用程序,在该应用程序中,仅使用了基本类库中的框架类和应用类,IE 控件是在框架窗口中被创建和使用的。按照窗口中使用 IE 控件的方法,设计实现了单栏浏览、多栏浏览、单栏多栏相互切换及多栏中某一栏的切换等多种浏览功能,解决了多栏中局部显示切换到全屏显示等问题,达到了设计目标。如果用户设计的是基于文档-视结构的应用程序,则需要根据实际情况调整创建和使用IE 控件的部位,并解决窗口显示与刷新等问题,但整体思路是不变的。
作者简介:张宇铮 工程师。 郭宝兰 教授。
作者单位:张宇铮 河北省外汇调剂中心 河北。石家庄(050051)
郭宝兰 河北大学电子与信息工程系 河北。保定(071002)
关键词 IE控件,控件包容器,超文本,浏览
具有非线性表达方式的、符合人类认知模型的超文本模式,已成为文本库组织结构的主流。用户在开发自己的超文本库应用时,往往需要设计、实现风格独特、具有个性、与应用紧密结合的超文本浏览功能。利用 Visual C ++ 的集成开发环境及 IE 控件,可以很方便地在自己的应用程序中实现该功能。
1 IE控件简介
IE 控件是一组遵从 OLE 控件技术的可重用代码。OLE 控件是一个可重用组件,它支持广泛的 OLE 功能,除具有可移植性外,还允许控件暴露可以编程的属性和方法,以供控件用户调用。控件用户只需构造控件包容器就能够通过使用控件的属性和方法操纵控件,并接收从控件发出的通知消息,从而达到代码重用、加快和减化程序设计的目的。
IE 控件随 Microsoft 公司的 Internet Explorer3.x 以上的版本一同发行,只要完成该软件的安装,在 VisualC++4.0 的组件廊中就会有一个名为 Web Browser Control的控件,此即为 IE 控件,它是具有浏览器一般功能的可重用代码。IE 控件提供了可供应用程序访问的一些重要方法和事件,通过这些方法的访问,以及事件消息的触发,应用程序可以操纵 IE控件,实现超文本浏览功能。
1.1 IE 控件提供的方法
方法在使用和目的上与 C++ 类的成员函数相似。应用程序可以通过方法实现与控件的通讯。
。 BOOL Create(LPCTSTR lpszWindowName, DWORD dwtyle, const RECT& rect,CWnd * pParentWnd, UINT nID, CFile* pPersist=NULL, BOOL bStorage=FALSE, BSTR bstrLicKey=NULL)
该方法通过调用 CWnd 类的 CreateControl() 成员函数动态创建 IE 控件,作为一种特殊类型的子窗口被激活。第一个参数可设为 NULL,第二、三个参数用于指定子窗口的类型和大小,第四个参数是父窗口指针,第五个参数是在资源文件中定义的一个符号。
。 void Navigate(LPCTSTR URL, VARIANT * Flags, VARIANT * TargetFrameName, VARIANT
。 PostData, VARIANT * Headers)
该方法用于联向某个接点,并装入由 URL 指定的超文本页面。后四个参数可设为 NULL。
。 void GoBack()
返回上一级页面,与Internet Explorer 的GoBack对应。
。 void GoForward()
进入下一级页面,与Internet Explorer 的GoForward对应。
。 void Refresh()
重新装载当前页面,与Internet Explorer 的Refresh对应。
。 void Stop()
停止当前工作,与Internet Explorer 的Stop对应。
。 void GetLocationURL()
获取当前页面地址。
1.2 IE 控件提供的事件
事件是用来通知用户有关控件发生的事情,作为触发消息与应用程序进行交互。
。 FrameBeforeNavigate: 多栏式超文本页面被装入前触发。相应的激起函数为:
OnFrameBeforeNavigateExplorer1(LPCTSTR URL,long FLags, LPCTSTR
TargetFrameName, VARIANT FAR * PostData, LPCTSTR Headers, BOOL FAR * Cancel)
其中 URL 参数传递的是将要被装入的页面地址,TargetFrameName 参数是多栏式超文本的栏目名,Headers 参数是前一页面的地址。
。 BeforeNavigate:每次装入页面前被触发。相应的激起函数为:
OnBeforeNavigateExplorer1(LPCTSTR URL,long FLags, LPCTSTR TargetFrameName,
VARIANT FAR * PostData, LPCTSTR Headers, BOOL FAR * Cancel)
其中参数说明同前。
。 StatusTextChange:每次IE控件的操作状态改变时被触发。相应的激起函数为:
OnStatusTextChangeExplorer1(LPCTSTR Text)
其中Text参数传递的是当前操作命令。
。 TitleChange: 页面标题改变时被触发。相应的激起函数为:
OnTitleChangeExplorer1(LPCTSTR Text)
其中Text参数传递的是当前页面标题。
2 IE控件包容器的设计
创建使用 IE 控件的应用程序,也就是要设计实现一个 IE 控件包容器。IE 控件包容器就是完全支持 IE 控件,并能够把控件组合进自己的窗口或对话框的程序。控件包容器的实现通常有两种形式,一种是在对话框中使用 IE 控件,另一种是在窗口中使用 IE 控件。
2.1 对话框中使用 IE 控件
在对话框中使用 IE 控件,可设计实现一个基于对话框的应用,将 IE 控件嵌入在对话框的某个地方。该方法的实现可以完全依赖于 Visual C++ 4.0 提供的编程支持环境:AppWizard和组件廊,用户只需写入不多几行代码就可以将超文本浏览功能加入到自己的应用程序中。以下简单介绍程序开发的几个步骤,具体 AppWizard 和组件廊的使用,用户可参阅 Visual C++ 的随机帮助或有关资料。
步骤一:利用 AppWizard 创建一个基于对话框并支持 OLE Controls的应用。
步骤二:通过组件廊将IE控件插入到步骤一创建的应用中。
步骤三:将 IE 控件加入到对话框资源中,并定义控件变量。
步骤四:根据应用程序的需要,访问 IE 控件提供的方法,并响应 IE 控件在运行过程中激起的各种事件,以实现复杂程度各异的浏览功能。最简单的一种方法是,在对话框的初始化成员函数中加入对 IE 控件 Navigate 方法的调用,如:
m-web.Navigate( "http:www.cfets.sjz.cn", NULL, NULL, NUll, NULL)
即可实现一个浏览地址 www.cfets.sjz.cn 处超文本主页的浏览器,其中,m-web 是在对话框资源中定义的IE控件变量。
2.2 窗口中使用 IE 控件
所谓窗口中使用 IE 控件,即将 IE 控件以子窗口的形式加入到应用中,Visual C++ 4.0 没有提供象第一种方法那样便利的支持,程序员需要设计一些程序段。具体的程序设计过程如下:
步骤一:如果在使用 AppWizard 工具创建应用程序的过程中,没有选择支持 OLE Control选项,则需要手工在应用的 InitInstance() 的成员函数加入 AfxEnableControlContainer()函数调用,然后在 STDAFX.H 头文件中加入如下语句:#include <Afxdisp.h>。经过上述过程,应用程序则具备了对 IE 控件的支持,可以作为 IE 控件的包容器方便地使用 IE 控件的方法并与之交互。
步骤二:使用组件廊将 IE 控件加入到已创建的应用程序中,这一操作自动在工程文件中加入 webbrowser.h 和 webbrowser.cpp 两个文件。在需要加载 IE 控件的程序段的 .h 头文件中,加入 #include "webbrowser.h" 语句。
步骤三:在需要加载 IE 控件的程序段中,动态申请创建 IE 控件子窗口,使该子窗口获得控制程序运行的权利。动态创建 IE 控件子窗口,首先需要在装载该控件的程序段的 .h 头文件中,将 IE 控件包裹类 CWebBrowser 说明为内嵌对象,语句如下:
public:
CWebBrowser m-browser;
内嵌对象是在栈中被申请的。当需要将 IE 控件激活时,则需在程序的相应位置调用 IE 控件提供的方法 Create(),有关语句如下:
myrect.SetRect(1,50,635,475);
CWnd。 pParentWnd = FromHandle(m-hWnd);
m-browser.Create(NULL,WS-VISIBLE|WS-BORDER,myrect,
pParentWnd,IDC-EXPLORER1, NULL, FALSE, NULL);
步骤四:使用 IE 控件提供的方法,实现超文本浏览功能。首先调用 Navigate() 方法将超文本加载,然后使用 goback()、goforward() 等对超文本进行浏览过程的操纵,还可以通过响应IE 控件触发的事件,使应用程序得到目前 IE 控件的执行情况,例如,当超文本被加载浏览后,可以通过文本中定义的超链进行多文本之间的转换,这样,使得在应用程序中除了其主动加载的第一个超文本页面外,还存在有一些被链入的超文本页面,当应用程序需要获得当前正被浏览的超文本页面信息时,可通过响应 IE 控件触发的 OnBeforeNavigateExplorer1() 事件,由其传递的参数得到。
应用程序通过事件接收映象表 (Event Sink Map) 机制接收和响应 IE 控件触发事件,映象表为每一个需处理的事件指定了一个相应的处理函数。组成事件接收映象表的宏指令有:
DECLARE-EVENTSINK-MAP: 对事件映象表的声明
BEGIN-EVENTSINK-MAP: 事件映象表的起始语句
END-EVENTSINK-MAP: 事件映象表的终止语句
ON-EVENT:定义某一特定事件的处理函数入口
在具体的程序设计中,首先,需要在有关程序段的 .h 头文件中,加入该事件处理函数的说明,函数说明语句的前面需加 afx-msg 字段,如:
public:
afx-msg void OnTitleChangeExplorer1 (LPCTSTR Text);
再将 DECLARE-EVENTSINK-MAP() 宏指令加在该头文件末尾。其次,在相应的 .cpp 源文件中说明事件映象表,有关代码如下:
BEGIN-EVENTSINK-MAP(CMainFrame,
CFrameWnd)
//{{AFX-EVENTSINK-MAP(CMainFrame)
ON-EVENT(CMainFrame,IDC-EXPLORER1,113 /*TitleChange*/,
OnTitleChangeExplorer1,VTS-BSTR)
......
//}}AFX-EVENTSINK-MAP
END-EVENTSINK-MAP()
有关 ON-EVENT 宏指令的参数说明,读者可以参阅 Visual C++ 的联机帮助。映象表中定义的相应处理函数需要根据具体情况进行编写。例如:
void CMainFrame::OnTitleChangeExplorer1(LPCTSTR Text)
{
// TODO: Add your control notification handler code here
CString tmp-str;
tmp-str = Text;
......
}
步骤五:当应用程序不再使用 IE 控件时,调用 CWnd 类的 DestroyWindow() 成员函数关闭IE 控件子窗口。
3 必要的说明
笔者在具体项目的开发中,设计实现的是一个不带文档和视结构的应用程序,在该应用程序中,仅使用了基本类库中的框架类和应用类,IE 控件是在框架窗口中被创建和使用的。按照窗口中使用 IE 控件的方法,设计实现了单栏浏览、多栏浏览、单栏多栏相互切换及多栏中某一栏的切换等多种浏览功能,解决了多栏中局部显示切换到全屏显示等问题,达到了设计目标。如果用户设计的是基于文档-视结构的应用程序,则需要根据实际情况调整创建和使用IE 控件的部位,并解决窗口显示与刷新等问题,但整体思路是不变的。
作者简介:张宇铮 工程师。 郭宝兰 教授。
作者单位:张宇铮 河北省外汇调剂中心 河北。石家庄(050051)
郭宝兰 河北大学电子与信息工程系 河北。保定(071002)