在VB中使用IE的 WebBrowser控件
改进界面设计
在程序设计中,如何设计出美观、实用,有个性的界面是每个程序设计者在界面设计中追求的目标。随着Windows XP的推出,各种与众不同的华丽界面越来越被程序设计者和软件使用者所认同。
利用Windows中的WebBrowser控件,可以把华丽的网页设计技术应用到界面设计中去,例如微软著名的MSN浏览器的许多界面其实就是一个Web页,Windows XP中的帮助中心、Microsoft Encarta(微软百科全书)等许多软件中的一些界面也是利用WebBrowser控件显示的Web页。
利用WebBrowser控件显示一个网页,制作一个简单的浏览器已经有很多文章介绍,实现也不复杂,但如何实现程序与Web页的交互则是将其应用到界面设计中的关键。
ActiveX控件和WebBrowser控件的使用
用 Visual Basic 创建一个应用程序的第一步是创建界面。而控件则是创建界面的基本模块,是包括在窗体对象内的对象。每种类型的控件都有自己的属性、方法和事件,属性一般控制控件的外观、大小等性质,方法则是控件的能力或者功能,事件则代表与用户的交互,例如鼠标的移动点击、键盘的输入等都会触发相应的事件。
WebBrowser控件是随IE 3.0以上版本提供的一个可编程的ActiveX控件,利用WebBrowser控件可以显示、控制、分析Web页,除了IE,chm格式的帮助的浏览,还广泛应用在以IE为核心的许多浏览器和其他程序中。
WebBrowser控件在VB中的使用很简单。启动VB,创建一个标准EXE工程,选择工程——部件,打开部件对话框,从中找到Microsoft Internet Controls,选中后单击应用,然后关闭对话框(下图),可以看到WebBrowser控件已经添加到工具栏。
将WebBrowser控件拖至窗体,调整到相应大小,打开代码窗口,在Form_Load过程中键入如下代码:
Private Sub Form_Load()
WebBrowser1.Navigate "http://www.sohu.com"
End Sub
运行程序,可以看到搜狐的主页显示在了相应的对话框中了。如果是本地的Web页只需将http://www.sohu.com替换为本地文件的全路径(目录+文件名)就可以了。
控制WebBrowser控件
利用WebBrowser控件的GoBack(后退)、GoForward(前进)、GoHome(主页)、Navigate(定位)、Refresh(刷新)、Stop(停止)等方法,可以实现浏览器的常规操作。例如实现地址栏的操作,可以先向窗体添加一个文本框和按钮,并向按钮的Click事件相应过程中添加如下代码:
Private Sub Command1_Click()
WebBrowser1.Navigate Text1.Text
End Sub
这样,向文本框输入地址,单击按钮,即可访问不同的站点。WebBrowser控件得其他操作方法类似,读者可以参考MSDN的有关介绍。
实现Web页与程序的交互
要实现Web页与程序的交互,其关键在于改写WebBrowser控件的BeforeNavigate2事件,截获需要与程序交互的动作,然后进行相应的操作。例如,我们在程序目录下新建一个简单的Web页test.htm,其内容如下:
<HTML>
<HEAD>
<TITLE> Test </TITLE>
</HEAD>
<BODY>
<A HREF="test1.htm">test1</A><br>
<A HREF="test1.htm">test2</A>
</BODY>
</HTML>
在Form_Load过程中键入如下代码:
Private Sub Form_Load()
WebBrowser1.Navigate App.Path & "\test.htm"
End Sub
运行程序,点击test1或者test2则打开相应的test1.htm(如果test1.htm存在),或者显示文件找不到错误。那么如何截获用户点击test1这个超链接呢,我们在BeforeNavigate2这个事件中键入以下代码:
If Right(URL, 9) = "test1.htm" Then
MsgBox "test1 clicked"
Cancel = True '使WebBrowser控件停止相应此事件
ElseIf Right(URL, 9) = "test2.htm" Then
MsgBox "test2 clicked"
Cancel = True
End If
运行程序,可以看到程序已经截获了用户点击相应超链接的事件(注意:right函数的使用是为了只提取url的最后部分,因为url还包括网络协议和目录等信息)。这样,我们就可以在程序界面中使用Web页来实现用户界面,并通过截获相应的点击事件,通过判断相应的url,得知用户的操作,从而使程序进行不同的操作。
换肤(Skin)的实现
利用以上的程序设计思路,我们来实现程序的换肤。因为程序的动作的处理集中在对WebBrowser控件BeforeNavigate2这个事件的处理上,只与url的值有关,与Web页的具体内容和设计没有关系,因此不但可以分离界面和程序的设计,而且可以轻松的实现诸如换肤此类操作。
具体实现办法可以简单叙述为以下几步:
1. 制作几个不同的Web页,但要保证相应的超链接(url)一致;
2. 在程序中设计一个换肤的操作,切换当前WebBrowser所显示的Web页;
3. 在BeforeNavigate2中处理所有的动作。
以下即为笔者设计的一个简单示例的运行画面。如果将窗体设置为无标题栏,无边框,效果就会更佳。
全部程序的代码如下,实现非常简单。
Option Explicit
Private Sub Form_Load()
WebBrowser1.Navigate App.Path & "\1.htm"
End Sub
Private Sub Option1_Click()
WebBrowser1.Navigate App.Path & "\1.htm"
End Sub
Private Sub Option2_Click()
WebBrowser1.Navigate App.Path & "\2.htm"
End Sub
Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
If Right(U