用AxWebBrowser的准备
"工具箱"->"添加/删除项"->"COM 组件"->"Microsoft Web 浏览器"->对勾->确定
IE样的东西就上到工具箱上了,拖过来即可使用
我们知道,C#创建基于Web页(Html)的AspC#应用程序,它使用Microsoft Internet Explorer(IE)实现页面的导航与浏览,对程序的导航控制通过IE自身提供的功能来实现,这个时候,导航控制实际上与程序代码是相对独立的,这表现在你不需要为此编制相应的代码也很难添加IE之外的其他控制。
其实,不仅仅是C#应用程序能操作Web页,C#创建的基于桌面的Windows Application(窗体应用程序)也能操作Web页。不同的是,这种开发仅有C#基类支持是不够的,你还需要借助一种特殊的COM-ActiveX控件。
基于桌面的Windows(窗体)应用程序
显然,即便在基于桌面的Windows应用程序下,也有很多地方跟Web文件打交道。本地的Html文件,网络传输中的Html文件,等等。这些包含丰富图文信息的Web文件,有时候需要作为应用程序的一部分进行操作。虽然,C#丰富的基类对文件(当然也包括.Html格式的Web文件)的读写提供了大量的支持,对文件内容的显示也提供了丰富的控件(如Windows标准控件ListBox、Label等),然而,这种通常意义下的输出只能将文件显示为纯文本字符或二进制数据,还无法直接在Windows应用程序中原样显示Html界面样式而保持Web文件"图文并茂、导航自如"的优点。
即便这样,C#名字空间Diagnostics还是提供了类Process以支持在应用程序中操作Web文件、实现Internet Explorer界面样式,以部分满足我们的需求。
1、使用Process 类
下面的讲解将借助实例来进行,并逐步扩充程序代码。为测试效果,请在Visual StudioC# IDE中构建VisualC#窗体应用程序WebPageInWindowsApplicaion。在窗体上添加按钮"buttonStart",添加文本框"textBoxUrl" ,导入名字空间System.Diagnostics(using System.Diagnostics;),在按钮"buttonStart"的Click事件中添加以下代码:
private void Start_Click(object sender, System.EventArgs e)
{
Process p=new Process();//实例化进程对象
string url=textBoxUrl.Text.Trim();//获取输入的Url
//StartInfo用于设置启动进程所需参数
p.StartInfo.FileName="iexplore.exe";//设置要启动的应用程序或文档
p.StartInfo.Arguments=url;//设置启动所需命令行参数
p.Start();//将进程与Process组件关联并启动
}
代码很简单,每行后的注释足够可以解释清楚了。需要注意的是,在使用Process.Start()方法启动该进程前至少必须设置FileName文件名属性,以指定提供支持的目标应用程序或文档。试着在文本框中输入"http://developer.ccidnet.com/pub/disp/Column?columnID=287"(当然,你也可以在程序中硬编码文本框内容,无论怎样,你需要确保该URL的有效性),单击Start按钮,IE浏览器将打开,Web页面被正确显示。
不过,你很容易就能看到,打开的IE浏览器并不包含在应用程序(主)窗体中,而是重新载入了IE浏览器,就象你通常在IE地址栏里输入URL浏览页面一样;的确,在这里,IE浏览器被作为一个新的、单独的窗口打开,这以后就不再与应用程序关联,或者说,不再受应用程序的控制了。一般地,这不是我们所需要的。
要真正让Web页与应用程序融为一体,一种可行的解决方法是使用ActiveX Control-WebBrowser控件。
2、ActiveX 技术
很明显,即便C#富含大量类库,但仍然不能完成所有的任务,或者说,不能很轻松地完成所有任务。很长一段时间里,由Windows API、COM(COM+)、ActiveX Control提供的许多功能在C#中将得到支持,使用它们在一定程度上为编程提供简化。
其中,ActiveX是Microsoft提出的一组使用COM(Component Object Model,组件对象模型)使软件部件在特定环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。
3、使用WebBrowser控件
WebBrowser控件就是ActiveX Controls的一种,它是Mircosoft在C#出现之前提供的ActiveX控件,用来为应用程序增加浏览功能,具备这个功能的基础是该控件对应的Dll(Shdocvw.dll)文件是Internet Explorer 的一部分,所以它能够在安装了 Internet Explorer 的系统上提供支持。
象其他ActiveX Control一样,Visual StudioC# IDE工具箱在默认情况下并不直接包含WebBrowser控件。不过,在应用程序中添加该控件很简单。在Visual StudioC# 开发环境下,在"工具箱"的"Windows 窗体"上点击鼠标右键,从弹出的上下文菜单中选择"自定义工具箱",在随后出现的"自定义工具箱"对话框的"com组件"标签里选中"Microsoft Web 浏览器",确定后,"Iexplorer"控件就会显示在工具箱中,它其实就是一个WebBrowser控件。这之后,象使用Windows标准控件一样,把Iexplorer控件拖入应用程序的窗体就可以了。Visual StuodC# IDE将自动生成所需要的部分COM代码,同时,C# windows应用程序也将自动添加AxSHDocVw及SHDocVx引用(你可以在应用程序解决方案管理器"引用"项下看到它们),分别对应于磁盘上的Interop.SHDocVw.dll和AxInterop.SHDocVw.dll文件(你可以在应用程序\Bin\Debug目录下找到它们)。同时,代码也将自动创建 AxSHDocVw.AxWebBrowser 实例对象,并设置默认名称为axWebBrowser1(语句:private AxSHDocVw.AxWebBrowser axWebBrowser1)。(为引用简化名称,可导入名字空间using AxWebBrowwer)
经过这些处理后,应用程序就已经成为WebBrowser控件的客户端了。WebBrowser控件能够浏览到任何指定位置的资源,包括本地文件系统、局域网上的文件系统及互联网所定位的资源。实际上,WebBrowser 控件定位到一个.Html 页,该页(隐式)调用 window.open 方法以打开一个新窗口。
1)、WebBrowser控件的事件
WebBrowser控件包含丰富的事件,用来捕捉与控件相关的变化并作出反应。其中,BeforeNavigate 2事件在对指定对象(窗体或框架元素)导航前激活,这个特性常被用来作一些验证工作,比如对客户录入的Url地址作有效性检查,以转换不标准的Url地址,有意义的是,这样的验证转换工作是自动完成的。例如,如果你输入的Url为"www.ccidnet.com",在该事件中引用Url属性就可以自动将它转换为标准格式的Url"http://www.ccidnet.com",并自动将转换结果存入事件的URL参数中。事件代码为:
private void axWebBrowser1_BeforeNavigate2(object sender,
AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2Event e)
{
textBoxUrl.Text=e.uRL.ToString();//textBoxUrl是文本框名,用来反映效果
}
另外,WebBrowser控件的DocumentComplete事件在文档载入及初始化完成时激活;NewWindow事件在创建新窗体时被激活,等等。
2)、WebBrowser控件的方法
同时,WebBrowser控件也包含大量方法,可以完成导航中的大部分操作。其中,GoBack()从历史记录表回退一个单元,GoForward()从历史记录表前进一个单元,GoHome() 定位到当前主页面或开始页,Stop()取消正进行的导航请求(包括下载操作)并停止任何动态页面元素(比如背景音乐)、Refresh ()可以刷新页面等等。
这些只是WebBrowser控件所支持方法的一部分,即便是这样,也可以看出,这些方法使你可以建立与Microsoft Internet Explorer功能类似的应用程序,你只需要做很少的工作,或许仅仅是响应按钮的事件。例如,在你的应用程序中添加一个"回退"按钮 buttonBack,其Click事件代码为:
private void buttonBack_Click(object sender, System.EventArgs e)
{
axWebBrowser1.GoBack();//axWebBrowser1是WebBrowser实例控件名
}
这样,类似IE浏览器的"后退"功能就实现了,你基本上没有做什么工作。
然而,在WebBrowser控件的所有方法中,Navigate()才是极主要的一个方法,真正的导航是依靠调用它来实现的。Navigate()方法能够导航到通过url指定的资源或者通过一个完整路径给出的文件路径(本地的或者网络上的文件)。方法的定义为:
object.Navigate( url As String, [Flags As Variant,] [TargetFrameName As
Variant,] [PostData As Variant,] [Headers As Variant])
其中,参数url是必须的的字符串表达式,用于定位要访问的资源,它可以是一个URL地址,也可以是一个完整的路径文件名,或者通过UNC(Universal Naming Convention)定位的资源。其余参数均为可选参数,其中Flags标识指示是否将资源添加到历史记录、是否从高速缓冲中读写资源数据以及是否在一个新的窗口中显示资源文件;而TagetFrameName主要用于带框架的URL在浏览器窗口中的显示,其可能的选项为:Blank(在新的空白窗口中显示)、PARENT(在当前窗口的父窗口显示)、SELF(在当前窗口显示)、TOP(在当前窗口主体装载链接)等;PostData参数用于指定以Post发送的、随Http请求的的数据;Header则包含Http请求的头信息。
需要注意的是,作为ActiveX Control,WebBrowser控件提供之初并不针对C#架构,所以并不能保证它与所有支持C#的开发语言完全无缝集成。比如,VisualC#语言是不支持可选参数的,因此,在Visual C#开发的Windows Application中调用WebBrowser控件的Navigate()方法时,所有的参数均需要明确地给出来,并且,这些可选参数均是引用类型(ref)。
继续扩展上面的例子,添加"buttonGo"按钮,输入Click事件代码为:
private void buttonGo_Click(object sender, System.EventArgs e)
{
string url=comboBoxUrl.Text;//取Url值
object o=null;//定义空的对象引用
axWebBrowser1.Navigate(url,ref o,ref o,ref o,ref
o);//浏览到指定资源
}
单击"Go"按钮,应用程序窗体中输出正确的资源,Web页被正确显示。
前面说了,Navigate()方法也能够导航到指定的文件,接着上面的应用程序,在窗体上添加"buttonFile"按钮,其Click事件代码为:
private void buttonFile_Click(object sender, System.EventArgs e)
{
OpenFileDialog ofd=new OpenFileDialog();//实例化"打开文件"对话框对象
if(ofd.ShowDialog()==DialogResult.OK)
{
Object o = null;//设置空对象
axWebBrowser1.Navigate(ofd.FileName, ref o, ref o, ref o, ref
o);//浏览指定文件
}
}
这样,在通过"文件打开"对话框指定文件后,WebBrowser控件就可以导航到文件对应的资源。
除Navigate()方法外,WebBrowser控件还有许多重要的方法,比如,ExecWB()方法在OLE对象上执行命令并通过IOleCommandTarget 接口返回命令执行的状态。
3)、使用WebBrowser控件开发浏览器应用程序
从上面我们知道,使用WebBrowser控件的Navigate方法能够通知浏览器定位到指定的资源。这甚至能支持你开发出具有完整功能的浏览器应用程序。这时,你的应用程序中或许需要添加其他windows标准控件:主菜单、用于导航控制的按钮、用于提示的状态条、用于进度的进度条。当然,由组合文本框及go按钮组成的地址栏是必不可少的。同时,在windows应用程序中,添加对话框是很容易的(在aspC#中可不这么简单)。不用担心,从上面的论述已经可以看出,实现这些控件的功能只需要简单的代码。
4)、WebBrowser控件作为其他ActiveX控件的容器
除此之外,WebBrowser控件也常用作应用程序窗体显示ActiveX文档的容器,如果你企图在Visual C# Windows Application 中打开Office文档,就需要使用WebBrowser控件。这时,使用传入 WebBrowser 对象的 Document 属性来获得对 Office 文档对象的引用。不过,由于WebBrowser控件不支持菜单合并,在试图添加多个WebBrowser控件并各自打开ActiveX文档时会引发一些问题,要小心。
5)、使用WebBrowser控件的优点
· WebBrower控件以异步方式加载,调用 WebBrowser1.Navigate 时,资源完全加载完之前该调用将
控制权返回到 Visual C# 应用程序,Navigate方法实际上在后台完成了以下两方面的工作:发送http请求和显示输出。
· WebBrowser控件不改变资源原有的导航方式(链接方式不变)。
· WebBrowser控件在需要的时候自动添加滚动条。
· WebBrowser控件自动作为资源显示的容器,不再需要其他显示控件。