您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页(八)练习实践

(八)练习实践

来源:爱go旅游网
练习实践

一、Hello World

二、第一个Windows程序

三、开发一个多种语言版本的C#程序 四、用Visual C# 2005创建快捷方式 五、用Visual C#打造多页面网页浏览器

一、Hello World

C#(发音为“See Sharp”)是简单、现代、面向对象和类型安全的编程语言。C#起源于C语言家族,因此,C,C++和Java的程序员很快就能熟悉它。C#已经获得了ECMA International和ISO/IEC的国际标准认证,它们分别是ECMA-334标准和ISO/IEC 23270标准。Microsoft用于.NET框架的C#编译器就是根据这两个标准实现的。

C#是面向对象的语言,但C#进一步支持面向组件(component-oriented)的编程。现代软件设计越来越依赖于自包含(self-contained)和自描述(self-describing)功能包形式的软件组件。这种组件的关键之处在于它们提供了带有属性、方法和事件的编程模型;它们还具有提供关于组件声明信息的特性(attribute);同时,它们编入了自己的文档。C#提供语言构件来直接支持这些概念,使得C#在创建和使用软件构件方面非常自然。

C#的一些特征支持创建健壮和持久的应用程序:垃圾回收(garbage collection)特征可以自动回收无用对象所占的内存空间;异常处理(exception handling)提供了一个结构化和可扩展的方式,用于错误检测和恢复;语言的类型安全(type-safe)设计了防止引用非初始化变量、数组下标越界,以及执行未检查的类型转换等情形的发生。

C#具有统一类型系统。所有的C#类型,包括诸如int和double的基本数据类型,都继承于单个根类型object。因此,所有类型都共享一组通用操作,并且,任何类型的值都能够以一致的方式存储、传递和操作。C#支持用户自定义引用类型和值类型,既允许对象的动态分配,也允许轻量结构的内联存储。

为了保证C#程序和类库总能以兼容的方式升级,在C#的设计中十分强调版本控制。许多程序语言不太重视这一点,导致采用那些语言编写的程序常常因为其所依赖的类库的更新而无法工作。C#的设计方面直接受到版本考虑的影响,包括分开的virtual和override修饰符、方法重载的规则,以及支持对显式接口成员的声明。

本章的其他部分将描述C#语言的本质特征。尽管后面的章节将更为详细,有时甚至是细致入微地描述这些规则和异常,但是本章力求对整个C#做一个简单明了的说明。其意图是向读者提供对语言的入门介绍,以便于读者上手编写程序和阅读后面的章节。

1.1 Hello World

学习某种编程语言,通常采用“Hello,World”程序作为起步。下面是C#版的:

using System; class Hello {

static void Main(){

Console.WriteLine(\"Hello,World\"); } }

C#源程序文件一般用.cs作为扩展名。假定“Hello,World”源程序文件被存为hello.cs,那么,使用下面的命令行就能通过Microsoft C#编译器编译这个程序:

csc hello.cs

它将产生一个名为hello.exe的可执行程序集。当程序运行时,输出结果如下:

Hello,World

“Hello,World”程序开头是using指令,引用了System命名空间(namespace)。命名空间提供了C#程序和类库分层次的组织手段。命名空间包含类型和其他命名空间,例如,System命名空间包含若干类型(如程序中引用的Console类),以及若干其他命名空间(如IO和Collections)。如果通过using指令引用给定命名空间,就可以对命名空间的成员进行非限定的使用。正是由于程序中使用了using指令,才能够将System.Console.WriteLine简写为Console.WriteLine。

“Hello,World”程序中声明的Hello类只有一个成员,即名为Main的方法。Main方法是用static修饰符声明的。静态方法不同于实例方法,后者需要使用关键字this来引用特定的对象实例,而静态方法的操作不需要引用特定的对象。作为约定,被命名为Main的静态方法充当程序的入口点。

程序输出是由System命名空间下Console类的WriteLine方法产生的。这个类是由.NET框架类库提供的,默认情况下,类库被Microsoft C#编译器自动引用。注意C#本身没有单独的运行时类库。事实上,.NET框架是C#的运行时类库。

二、第一个Windows程序

前言

C#是一门现代的编程语言,包含在 Visual Studio .Net 7.0 中。它简化了C++的复杂性,保持了灵活性,对于学过C++的人来说很容易上手。写本文的时候 Visual Studio .net 7.0 2003 已经发布,本文即针对此版本做一些简单的开发尝试。

一、创建工程

如图所示,在集成开发环境的File菜单中选择New->Project打开新建工程对话框:

我们选择工程类型为Visual C# Projects,在模板中选择Windows Application, 在Name处输入工程名称:HelloWindows,在Location中输入保存的路径。

确定后,系统自动为你生成了程序框架。现在我们来简单地熟悉一下这个开发环境中。

这就是我们的开发环境!

A区是我们的工具箱,包括对数据库、组件、窗体控件等的支持,我们都可以选择并加入到form中,假如你找不到Toolbox,请在菜单View中选择Toolbox以打开它。

B区是我们的设计工作区(包括对界面、代码的设计),图中显示的是我们刚才新建的应用程序的主窗口:Form1。

C区相当于我们在VC6中的workspace:Solution Explorer可以看成是以前的FileView,ResourceView和ClassView大家一定是很熟悉了,看到Solution Explorer中的 Form1.cs了吗?这就是Form1对应的C#文件,双击它就可以对Form1进行界面设计,鼠标右键单击Form1.cs在弹出菜单中选择View Code便可以查看对应的代码。

D区是属性窗口:类似我们在VC6中资源编辑器里的属性窗口,但功能更强大,对于屏幕上的组件比如按钮、列表框你都可以在这里直接修改其属性:如文字、背景色等。

我们接下去的任务是制作关于对话框,并添加菜单用于打开此对话框。 二、添加新的Form:关于对话框

选择菜单Project->Add Windows Form,在弹出的对话框中选择类别为Local Project Items,选择模板为Windows Form,在Name中输入文件名:AboutDlg.cs,确认。新的Form出现在工作区,我们在D区的属性对话框中修改Text为“关于”,选择BackColor为淡蓝色,你也可以尝试其它属性的改变。

接下去,我们打开Toolbox,选择Win Forms中的Label,然后在窗体中画出,并在属性对话框中修改Text为\"VC知识库欢迎您!http://www.vckbase.com\我们在Win Forms中再加入一个Button,修改Text为“确认”。

至此,对话框的界面我们设计好了,但当用户按下确认按钮的时候,我们如何关闭对话框呢?

我们双击“确认”按钮,这样系统会为按钮自动添加按钮的处理代码,在其中我们添加Close()函数用以关闭,如下所示:

protected void button1_Click (object sender, System.EventArgs e) {

Close(); ///这是我们增加的一句 }

关于对话框已经完成了,我们接下去要做的是为主视窗添加菜单,当选择菜单中的关于,我们就弹出“关于对话框”,让我们继续吧...

三、为主视窗添加菜单

在SolutionView中双击Form1.cs打开Form1,在Toolbox->Win Forms中选择MainMenu,并在Form1中画出,在“TypeHere”字样处我们可以输入菜单条,如图所示:

双击关于字样,系统会为我们添加该菜单条的处理代码,我们可以在其中添加打开\"关于对话框\"的代码:

protected void button1_Click (object sender, System.EventArgs e) {

AboutDlg dlg = new AboutDlg();///分配AboutDlg对象 dlg.ShowDialog();///显示对话框 }

好了,我们的程序写好了,让我们按F5看看效果吧!

后记

C#的功能远远不止与此,本文的目的是让用过VC6的朋友对C#中WINDOWS应用程序的开发尽快上手,只当抛砖引玉。

三、开发一个多种语言版本的C#程序

在C#中有多种使用资源文件的方法,能够很方便地开发全球通用的应用程序。本文通过一个简单的小例子,来讲解在C#中如何利用资源文件,快速开发一个多种语言版本的程序。本例中只有一个窗体,三个控件,能够根据用户的设置以中文或英文界面运行。开发环境是Windows 2000 Professional、Microsoft Visual Studio.NET 2002。具体开发步骤如下:

一、新建项目

启动Microsoft Visual Studio .NET,新建一个C#项目MyApp,本例工程存放于F:\\Csharp\\MyApp。

二、添加控件

在Form1 窗体上添加三个控件(见图1):主菜单MainMenu、标签Label1和按钮Button1。Label1和Button1控件的属性均采用缺省设置。MainMenu控件中添加三个菜单项menuItem1、menuItem2、menuItem3。Text属性分别设为“语言”、“中文”和“English”。menuItem2、

menuItem3 的RadioCheck属性设为True。

图 1

三、创建配置文件

在项目中添加一个文本文件MyAppConfig.ini,保存当前程序的语言版本设置。该文件中只有一行内容。如果是“English”,则表示程序为英文版;如果是“Chinese”则为中文版。这里暂且保存为“English”。

四、创建资源文件

.NET中的资源文件有三种: 文本(.txt )文件、XML 格式的.Resx 文件和.Resources 文件。文本文件只能包含形如“ 名称= 值”格式的字符串资源。.Resx文件和.Resources 文件中不仅能保存字符串资源,还能保存图像等可序列化的持久对象

资源。但是只有.resources 文件格式的资源文件才能被嵌入到运行库可执行文件中,或被编译为附属程序集。利用Visual Studio .NET 中自带的资源文件生成器

(Resgen.exe),可以将.txt文件和.Resx文件转换为.resources 文件格式。本例中只用到了字符串资源,所以在项目中添加两个文本文件Resource_zh.txt 和Reource_en.txt。

Reource_en.txt 文件中的内容:

menuItem1_Name=Language button1_Name=Exit label1_Text=This is English version!

Resource_zh.txt 文件中的内容:

menuItem1_Name=语言 button1_Name=退出 label1_Text=这是中文版!

需要注意的是Resource_zh.txt文件中含有汉字,必须以UTF-8编码保存。在Visual Studio .NET集成开发环境中,可以先点击“文件”菜单中的“高级保存选项”,选中UTF-8编码格式,再保存文件。

然后,点击“程序”菜单中的“Visual Studio .NET命令提示”菜单,进入DOS方式,输入以下两行命令,生成程序中能够访问的资源文件MyApp.resources和MyApp.zh-CN.resources。英文资源文件MyApp.resources 作为默认的后备资源文件。MyApp.zh-CN.resources

是中文资源文件,文件名中的“MyApp”是资源文件的根名称,必须与后备资源文件的根名称相同,“zh-CN”指定资源文件的区域性。

F:\\Csharp\\MyApp>resgen Resource_en.txt,MyApp.resources F:\\Csharp\\MyApp>resgen Resource_zh.txt,MyApp.zh-CN. resources 五、修改代码

1、在代码的开头添加需引用的命名空间。

using System.Globalization; using System.Resources; using System.Threading; using System.IO;

2、在Form1 中定义两个字段ci和rm。CultureInfo对象ci用来指定读取资源文件时的区域性。ResourceManager对象rm用来在指定的资源文件中读取资源。

CultureInfo ci = new CultureInfo(\"\"); Res ource Manag er rm = Res ource Manag er.CreateFileBasedResourceManager(\"MyAPP\

3、在Form1中添加一个方法ReadResources,用来读取相应资源文件中的字符串资源,来修改界面菜单、标签和按钮上文字显示。

private void ReadResources(){

this.menuItem1.Text = rm.GetString(\"menuItem1_Text\ this.button1.Text = rm.GetString(\"button1_Text\ this.label1.Text = rm.GetString(\"label1_Text\ this.Refresh(); }

4、在Form1 的Load事件处理过程中,根据配置文件的内容,调用ReadResources方法,读取资源,显示程序界面。

private void Form1_Load(...) {

StreamReader sr=File.OpenText(\"MyAppConfig.ini\"); if (sr.ReadLine()==\"Chinese\"){ ci = new CultureInfo(\"zh-CN\"); menuItem2.Checked=true; } else {

ci = new CultureInfo(\"en\"); menuItem3.Checked=true; }

sr.Close();

this.ReadResources(); }

5、在Form1 中添加一个方法SaveConfig,用来修改配置文件。在menuItem2 和menuItem3 的Click事件过程中调用S a v e C o n f i g 方法,分别将字符串“Chinese”、“English ”写入配置文件,并调用ReadResources方法,来更新界面。

private void SaveConfig(string p_Language){

StreamWriter sw=File.CreateText(\"MyAppConfig.ini\"); sw.WriteLine(p_Language); sw.Close(); }

private void menuItem2_Click(...){

this.SaveConfig(\"Chinese\");ci = new CultureInfo(\"zh-CN\"); menuItem2.Checked=true; menuItem3.Checked=false; this.ReadResources(); }

private void menuItem3_Click(...){ this.SaveConfig(\"English\"); ci = new CultureInfo(\"en\"); menuItem2.Checked=false; menuItem3.Checked=true; this.ReadResources(); }

6、在按钮button1的Click事件过程中,关闭窗体,结束运行程序。

private void button1_Click(...) { this.Close(); }

六、编译并运行程序

如果手工编译源程序,只需点击“Visual Studio.NET 命令提示”菜单,进入DOS方式,输入下面命令,即可生成二进制的可执行文件MyApp.exe,然后输入MyApp,就能运行程序。

F:\\Csharp\\MyApp>csc /out:MyApp.exe form1.cs

如果是在Microsoft Visual Studio .NET 集成开发环境中运行程序,将自动进行编译,并将编译的二进制可执行文件放到bin\\Debug子目录下。此时,需要注意的是要将MyAppConfig.ini、MyApp.resources 和MyApp.zh-CN.resources 这三个文件也复制到bin\\Debug\\子目录下,程序才能正常运行。

程序第一次运行时,是英文界面(见图2),点击菜单“中文”,将变成中文界面(见图3)。单击按钮“Exit”,退出程序后,再次运行程序时,直接显示中文界面。

图2

图3

四、用Visual C# 2005创建快捷方式

创建快捷方式对于绝大多数 Windows 用户来说都是小菜一碟了,然而,这项工作却为程序员带来不少麻烦。.NET 没有提供简便直接的创建快捷方式的方法,那么在 .NET 中我们如何为应用程序创建快捷方式呢?

1. 快捷方式文件

快捷方式实质上是一个扩展名为 .LNK 的文件。右击一个快捷方式文件并选择属性,跳到快捷方式选项卡,如图1所示:

你可以看到一个快捷方式包含如下数据:

·快捷方式的名字

·快捷方式所指向的目标所在的位置

·快捷方式所指向的目标的工作目录

·激活该快捷方式的热键

·快捷方式所指向的目标运行时的窗口风格(普通、最大化和最小化)

·该快捷方式的描述性文字

·快捷方式的图标所在的位置

2. 使用 WSH 创建快捷方式

2.1 添加 WSH 的引用

这里我使用 Visual C# 2005 Express Edition Beta 2 来开发的,添加引用的方法非常简单,右击你的项目并选择添加引用,选择 COM 选项卡并选择 Windows Script Host Object Model,如图2所示:

2.2 创建你的快捷方式

创建一个快捷方式的完整代码如下:

// Code #01

using System;

using IWshRuntimeLibrary;

class Program {

static void Main(string[] args) {

WshShell shell = new WshShell();

IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(

Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + \"\\\\\" + \"Allen’s Application.lnk\" );

shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location; shortcut.WorkingDirectory = System.Environment.CurrentDirectory; shortcut.WindowStyle = 1;

shortcut.Description = \"Launch Allen’s Application\";

shortcut.IconLocation = System.Environment.SystemDirectory + \"\\\\\" + \"shell32.dll, 165\";

shortcut.Save(); } }

首先,我们创建一个 WshShell 的实例对象,接着通过该对象的 CreateShortcut 方法来创建 IWshShortcut 接口的实例对象,传递给 CreateShortcut 方法的参数是将要创建的快捷方式的完整路径(包括该快捷方式的名字)。接下来,我们就要设置 IWshShortcut 实例对象的相关属性值了。

2.3 设置快捷方式的属性

2.3.1 TargetPath

该属性仅用于设置或者读取快捷方式的目标所在的位置。Code #01 中,将要创建的快捷方式指向本应用程序。

2.3.2 WorkingDirectory

该属性指定应用程序的工作目录,当用户没有指定一个具体的目录时,快捷方式的目标应用程序将使用该属性所指定的目录来装载或保存文件。

2.3.3 WindowStyle

该属性指定快捷方式的目标应用程序的窗口为普通(原始)状态、最小化或者最大化。对比图1中 Run 下拉菜单的项,该属性的值及其意义如下:

Value 1 3 7

2.3.4 Description

该属性设置用于设置或者读取快捷方式的附加说明。

2.3.5 IconLocation

该属性用于指定快捷方式的图表的所在位置,它的值包含一个完整的路径和一个索引值。Code #01 中,快捷方式的图标被设定为系统文件夹中的 Shell32.dll 文件所包含的第165个图标。

2.4 生成快捷方式

CreateShortcut 仅仅创建一个 IWshShortcut 的实例对象,它不会为你生成任何快捷方式,当一切就绪后,你必须调用 IWshShortcut.Save 方法才能生成快捷方式文件。

3. 活用快捷方式简化操作

想象一下你的应用程序支持命令行参数组合运行,例如:

Meaning Normal window Maximized Minimized

App /out:output.txt /sortby:date /desc

而你又希望只需要轻轻按下 CTRL+ALT+F11 就可以直接启动这项功能,这时你就需要用到 IWshShortcut 的 Arguments 和 Hotkey 两个属性了:

// Code #02

shortcut.Arguments = \"/out:output.txt /sortby:date /desc\"; shortcut.Hotkey = \"CTRL+ALT+F11\";

注意:Hotkey 属性的值里面不能包含空格。

你可以在应用程序里面像平常那样处理命令行参数:

// Code #03

class Program {

static void Main(string[] args) {

foreach (string arg in args) {

Console.WriteLine(arg); } } }

// Output: //

// /out:output.txt // /sortby:date // /desc

现在,你把这个快捷方式放到桌面,每当你需要运行的时候,轻轻的按下 CTRL+ALT+F11 就行了,Cool ~ ~ ~

五、用Visual C#打造多页面网页浏览器

一、简介

大家都知道,目前比较流行的网络浏览器如Mozilla FireFox以及MyIE2等都具有多页面浏览功能,每打开一个新的页面都自动产生一个新的选项卡页面,页面的关闭也十分简便。这种设计思想使得用户在浏览多个网页时桌面十分简洁,也避免了用户等待单页面显示的苦恼。由于这些浏览器一般都支持操作多种文件格式,所以当浏览本地机器上的多个文件时也极为方便。

本文使用Visual C#详细介绍如何实现这种多页面浏览功能。同时,还实现了下面附加功能: 打印, 打印预览,页面属性,选项,查找,查看页面源文件等。

二、关键技术分析

解决问题的关键在于对浏览器控件WebBrowser的NewWindow2事件的编程。当需要显示某种文件而生成一个新窗口时,NewWindow2 事件即被激活。注意,该事件发生在WebBrowser控件的新窗口产生之前。例如,作为对导航到一个新窗口或者一个脚本控制的window.open方法的响应,即发生该事件。为了声明当一个新窗口被打开时,将使用我们自己的浏览器程序,应该把参数ppDisp置为Application 对象。此时,如果你选择“在新窗口中打开”,则新产生一个窗口来显示Web页面。你也可以把RegisterAsBrowser设置为TRUE,这将导致新生成的WebBrowser控件参与到窗口命名的冲突问题上。例如,如果一个窗口的名字在脚本的另外一处用到,那么该控件被派上用场,而不是再产生一个新的窗口,因为控件在打开一个新的窗口之前先检查一下所有已存在的窗口名称以避免命名冲突。 在本文示例中,作为对该事件的响应,我们动态地创建一个tab页面,并通过调用CreateNewWebBrowser()方法产生一个WebBrowser控件作为其子控件――这里每一个子控件都有一个包含该控件相关信息的tag属性。详见下面的源码:

private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e) {

AxSHDocVw.AxWebBrowser _axWebBrowser = CreateNewWebBrowser(); e.ppDisp = _axWebBrowser.Application; _axWebBrowser.RegisterAsBrowser = true; }

private AxSHDocVw.AxWebBrowser CreateNewWebBrowser() {

AxSHDocVw.AxWebBrowser _axWebBrowser = new AxSHDocVw.AxWebBrowser(); _axWebBrowser.Tag = new HE_WebBrowserTag(); TabPage _TabPage = new TabPage(); _TabPage.Controls.Add(_axWebBrowser); _axWebBrowser.Dock = DockStyle.Fill; _axWebBrowser.BeforeNavigate2 += new

AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(this.axWebBrowser1_BeforeNavigate2);

_axWebBrowser.DocumentComplete += new

AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(this.axWebBrowser1_DocumentComplete);

_axWebBrowser.NavigateComplete2 += new

AxSHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.axWebBrowser1_NavigateComplete2);

_axWebBrowser.NavigateError += new

AxSHDocVw.DWebBrowserEvents2_NavigateErrorEventHandler(this.axWebBrowser1_NavigateError);

_axWebBrowser.NewWindow2 += new

AxSHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(this.axWebBrowser1_NewWindow2);

_axWebBrowser.ProgressChange += new

AxSHDocVw.DWebBrowserEvents2_ProgressChangeEventHandler(this.axWebBrowser1_ProgressChange);

_axWebBrowser.StatusTextChange += new

AxSHDocVw.DWebBrowserEvents2_StatusTextChangeEventHandler(this.axWebBrowser1_StatusTextChange);

_axWebBrowser.TitleChange += new

AxSHDocVw.DWebBrowserEvents2_TitleChangeEventHandler(this.axWebBrowser1_TitleChange);

_axWebBrowser.CommandStateChange += new

AxSHDocVw.DWebBrowserEvents2_CommandStateChangeEventHandler(this.axWebBrowser1_CommandStateChange);

tabControl1.TabPages.Add(_TabPage); tabControl1.SelectedTab = _TabPage;

return _axWebBrowser; }

注意,每一个WebBrowser控件都有一个tag,我定义成一个简单的class,它用来包含一些该控件相关的独有信息。请看:

public class HE_WebBrowserTag {

public int _TabIndex = 0; public bool _CanBack = false; public bool _CanForward = false; }

三、实现“查找”、“查看页面源文件”、“选项”对话框等功能

注意 本例程中使用了一个未公开的GUID,其在将来的系统中可以发生变更。

1、定义 IOleCommandTarget 接口

为定义一个.NET接口以获得关于一个COM接口的参考,请遵从下列步骤:

1) 赋予.NET接口相应的COM接口的GUID值;

2) 包含对接口中所有方法的类型声明;

3) 包含对Mshtml.dll和Shdocvw.dll文件的参考,在Visual C# .NET工程中操作,请遵从:

A. 在项目菜单下单击“添加引用”;

B. 单击“COM” 选项卡;

C. 双击“Microsoft HTML Object Library” 和“Microsoft Internet Controls”。

4) 应该在程序命名空间声明之前,包含下面的接口声明以添加对Microsoft HTML (MSHTML) IOleCommandTarget接口的参照引用:

using System;

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]

public struct OLECMDTEXT {

public uint cmdtextf; public uint cwActual; public uint cwBuf;

[MarshalAs(UnmanagedType.ByValTStr,SizeConst=100)]public char rgwz; }

[StructLayout(LayoutKind.Sequential)]

public struct OLECMD {

public uint cmdID; public uint cmdf; }

// IOleCommandTarget的Interop定义

[ComImport,

Guid(\"b722bccb-4e68-101b-a2bc-00aa00404770\"),

InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

public interface IOleCommandTarget {

//重要: 下面方法的顺序非常重要,因为本示例中我们使用的是早期绑定,详见MSDN中有关.NET/COM互操作的参考。

void QueryStatus(ref Guid pguidCmdGroup, UInt32 cCmds,

[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] OLECMD[] prgCmds, ref OLECMDTEXT CmdText);

void Exec(ref Guid pguidCmdGroup, uint nCmdId, uint nCmdExecOpt, ref object pvaIn, ref object pvaOut); }

2、为CGID_IWebBrowser定义一个GUID

必须定义CGI_IWebBrowser的GUID以通知MSHTML如何来处理你的命令ID。在.NET中实现如下:

private Guid cmdGuid = new Guid(\"ED016940-BD5B-11CF-BA4E-00C04FD70816\"); private enum MiscCommandTarget { Find = 1, ViewSource, Options }

3、调用Exec()方法

注意,下列三个过程成功调用Exec()的前提是,已经存在名为webBrowser的浏览器控件的被包容实例。

private mshtml.HTMLDocument GetDocument() { try {

mshtml.HTMLDocument htm = (mshtml.HTMLDocument)axWebBrowser2.Document; return htm; } catch {

throw (new Exception(\"不能从WebBrowser控件中获取文件对象\")); } }

//查看源码的方法

public void ViewSource() {

IOleCommandTarget cmdt; Object o = new object(); try {

cmdt = (IOleCommandTarget)GetDocument();

cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.ViewSource,

(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o); }

catch(Exception e) {

System.Windows.Forms.MessageBox.Show(e.Message); } }

public void Find() {

IOleCommandTarget cmdt; Object o = new object(); try {

cmdt = (IOleCommandTarget)GetDocument();

cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.Find,

(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o); }

catch(Exception e) {

System.Windows.Forms.MessageBox.Show(e.Message); } }

//显示“选项”对话框的方法

public void InternetOptions() {

IOleCommandTarget cmdt; Object o = new object(); try {

cmdt = (IOleCommandTarget)GetDocument();

cmdt.Exec(ref cmdGuid, (uint)MiscCommandTarget.Options,

(uint)SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref o, ref o); } catch {

// 注意:因为该过程相应的CMDID是在Internet Explorer处理 // ,所以此处的异常代码块将总被激活,即使该对话框及其操作成功。 //当然,你可以通过浏览器选择设置来禁止这种错误的出现。 //不过,即使出现这种提示,对你的主机也无任何损害。 } }

四、总结

本文通过C#编例,详细介绍如何实现一种多页面浏览程序的基本原理。欢迎同仁批评指正。 另外,本文所附源程序在Windows 2000/.Net 2003/Internet Explorer 6平台上调试通过。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务