从"在 Internet Explorer 中使用 Windows 窗体控件"开始谈Smart Client

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體:   |    |    |  超大  

本主题描述如何在 Internet Explorer (IE) 内成功地执行 Windows 窗体控件。IE 内的 Windows 窗体控件无需用户提示即可激活,它不要求注册,而且利用公共语言运行库 (CLR) 代码访问安全性。

在 Internet Explorer 内激活 Windows 窗体控件需要五步,这里列出了每一步,并在下面详细介绍。 创建 Windows 窗体控件。 创建带有 object 标记的 HTML 文档。 创建虚拟目录并设置权限。 运行该控件。 创建 Windows 窗体控件在 Internet Explorer 中几乎可以承载任何 Windows 窗体控件,但是对于此示例,我们将承载本快速入门教程的创建控件部分中包含的 SimpleControl。该控件必须安装到全局程序集缓存中或者与包含它的 Web 页位于同一虚拟目录中。

创建带有 object 标记的 HTML 文档下一步是创建带有 object 标记的 HTML 文档,该标记引用 Windows 窗体控件。对于此示例,还将添加一些简单的脚本和输入标记,以演示对该控件进行编程访问。

<object id="simpleControl1"classid="http:SimpleControl.dll#Microsoft.Samples.WinForms.Cs.SimpleControl.SimpleControl"height="300" width="300" VIEWASTEXT><param name="Text" value="Simple Control"></object>

classid 有两个令人感兴趣的部分:指向控件库的路径和控件的完全限定名,这两者由 # 号分隔开。如果您熟悉 ActiveX object 标记,将注意到缺少一个 guid。在 Windows 窗体中,路径和完全限定类名的组合作为唯一标识符。

Param 标记可用于设置控件上的属性。在这种情况下,name 特性是属性的名称,value 特性是属性的值。

<script>function ChangeText() {simpleControl1.Text = text1.value;}</script>?-<input type="text" id="text1"><input type="button" value="Change Text" onclick="ChangeText()">

若要获取对控件的编程访问,可以针对该控件编写脚本。将该页上的按钮和文本框与简单 JScript 函数 ChangeText 一起使用来设置控件的 text 属性。下面是此示例的完整 HTML 和脚本代码。

<html><script language="JScript">function ChangeText() {simpleControl1.Text = text1.value;}</script><body><p>Simple Control<br><br></body><object id="simpleControl1"classid="http:SimpleControl.dll#Microsoft.Samples.WinForms.Cs.SimpleControl.SimpleControl"height="300" width="300" VIEWASTEXT><param name="Text" value="Simple Control"></object><br><br><input type="text" id="text1"><input type="button" value="Change Text" onclick="ChangeText()"></html>

创建虚拟目录并设置权限该 HTML 页必须驻留在 Web 服务器上的 IIS 虚拟目录中,而且必须具有相应的权限。在此示例中,Windows 窗体控件驻留在同一目录中,但它也可以安装到全局程序集缓存中。虚拟目录上的执行权限必须设置为 scripts,如果执行权限设置为 scripts & executables,则将无法正确激活该控件。对于此示例,已经为您执行了这些步骤。

运行该控件若要运行该控件,只需将 Internet Explorer 指向虚拟目录中的该 HTML 页。如果该控件没有正确激活,可能需要重新启动 Internet Explorer。

///////////////////////////////////////////////////////////////////////////////

//引用结束

自从我上次看了MSDN的WebExc活动上小陈在webcast_asp.net_2(也就是asp.net技巧2)里演示的在网页里放上window程序的所谓Smart Client(不知道有没有单词写错了),我就老是睡不着觉。怎么型呢?

而且老是重复的看小陈打开的那两个原代码的图片:

那,小陈的这个代码跟上面引用的那个文章里的:

<object id="simpleControl1"

classid="http:SimpleControl.dll#Microsoft.Samples.WinForms.Cs.SimpleControl.SimpleControl"

height="300" width="300" VIEWASTEXT>

<param name="Text" value="Simple Control">

</object>

可以说是一样的。

以前,我并没有十分注意的去看window forms快速入门的文章。我记得我以前是看过那些的文章。但是我一直都是开发B/S为主,所以就算是看了也因为没有应用起来而忘了。//话外

于是我按照快速入门的示例代码完全一样的做了一个。

成功了!

心里感觉特别的兴奋,就算是半夜了我也要继续搞下去。

我就自己开始做了……

我第一个放上去的是,把一个正常情况写出来的窗体。

显示不出来,我晕了。为什么显示不出来啊。我也是按上面的意思做的啊!

我又把自己的代码看了好几遍,没错的,可就是没戏。

//我后来的摸索才发现,窗体是不能放上去的,而只能放控件

请再参考一下上小陈上次演示的程序图片:

这个图片中(左为web上的,左为window),你会发现小程演示时的window窗体跟web上那个有一点点不一样:就是winow上多了一个“Game”菜单。

所以它是一个窗体文件(控件上不能放MainMenu控件)。而不是控件。而菜单下面的那个就是了。所以它才能被分离出来放在web上(放在web上的应该是用户控件或是自定义控件)。

我原先以为,小陈那个.exe文件放上去。是一个应用程序的Main()函数起动的。

我再说一次窗体文件是不能放上去的。或说所有继承自Form的文件都不放上去。(原因我还不知道。我过去一直是搞b/s的。呵呵。)

自把窗体文件放上去失败之后,我又试了很多次把控件放上去。当中的失败我就不多讲了。我把摸索出来的一些可能对大家有用的东西给大家分享。

1。在这里我建议大家用“用户控件”先玩一玩:用它比较方便。自定议控件的操作有点儿不可视化。但是,只要是控件都是可以的。

2。控件代码里的一部份代码要删掉!

新建一个用户近件的默认代码是:

using System;

using System.Collections;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

namespace WindowsApplication3

{

/// <summary>

/// UserControl1 的摘要说明。

/// </summary>

public class UserControl1 : System.Windows.Forms.UserControl

{

/// <summary>

/// 必需的设计器变量。

/// </summary>

private System.ComponentModel.Container components = null;//需删掉

public UserControl1()

{

// 该调用是 Windows.Forms 窗体设计器所必需的。

InitializeComponent();

// TODO: 在 InitializeComponent 调用后添加任何初始化

}

/// <summary>

/// 清理所有正在使用的资源。

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}//这个方法需删掉

#region 组件设计器生成的代码

/// <summary>

/// 设计器支持所需的方法 - 不要使用代码编辑器

/// 修改此方法的内容。

/// </summary>

private void InitializeComponent()

{

components = new System.ComponentModel.Container();//需删掉,不过你只要在设计器里拉一个控件,它就会没有了。

}

#endregion

}

}

如果不去掉的话会无法在Web上正常运行。去掉后的代码:

using System;

using System.Collections;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

namespace WindowsApplication3

{

/// <summary>

/// UserControl1 的摘要说明。

/// </summary>

public class UserControl1 : System.Windows.Forms.UserControl

{

/// <summary>

/// 必需的设计器变量。

/// </summary>

public UserControl1()

{

// 该调用是 Windows.Forms 窗体设计器所必需的。

InitializeComponent();

// TODO: 在 InitializeComponent 调用后添加任何初始化

}

#region 组件设计器生成的代码

/// <summary>

/// 设计器支持所需的方法 - 不要使用代码编辑器

/// 修改此方法的内容。

/// </summary>

private void InitializeComponent()

{

}

#endregion

}

}

原因问题我也不是很明白。但是资源清理的话,我想,控件加载后是放在web的缓存里的。一但关掉。缓存里的数据也就没有了//我对windows方面不熟悉,所以可能讲得很错误:)

3。在web上的window控件不能以XP的风格运行(或许可以,但是我弄了好久也没戏,毕竟我是window外行。谁弄出来了一定要贴出来共享)

4。项目不管是编译成.exe或是.dll文件都是可以的.

好了,现在我们开始来做一个试试。

新建一个C#窗口项目,名字随便取,我取了个:SmartClient1

项目里的Form1.cs文件,你不喜欢就把它删掉也可以。我是把它删除了。

然后新建一个用户控件:UserControl1.cs文件。

在它上面随便拉一个控件出来上去。我是拉了一个button控件。

然后我改了一下背景色和控件的背景色。

全部代码如下:

using System;

using System.Collections;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

namespace SmartClient1

{

/// <summary>

/// UserControl1 的摘要说明。

/// </summary>

public class UserControl1 : System.Windows.Forms.UserControl

{

private System.Windows.Forms.Button button1;

/// <summary>

/// 必需的设计器变量。

/// </summary>

public UserControl1()

{

// 该调用是 Windows.Forms 窗体设计器所必需的。

InitializeComponent();

// TODO: 在 InitializeComponent 调用后添加任何初始化

}

#region 组件设计器生成的代码

/// <summary>

/// 设计器支持所需的方法 - 不要使用代码编辑器

/// 修改此方法的内容。

/// </summary>

private void InitializeComponent()

{

this.button1 = new System.Windows.Forms.Button();

this.SuspendLayout();

//

// button1

//

this.button1.BackColor = System.Drawing.Color.Teal;

this.button1.Location = new System.Drawing.Point(352, 112);

this.button1.Name = "button1";

this.button1.TabIndex = 0;

this.button1.Text = "button1";

//

// UserControl1

//

this.BackColor = System.Drawing.Color.PaleTurquoise;

this.Controls.Add(this.button1);

this.Name = "UserControl1";

this.Size = new System.Drawing.Size(456, 150);

this.ResumeLayout(false);

}

#endregion

}

}

好了编译一下。(我是把它编程成DLL文件)

下一步我们来建立调用它的html页。

要建之前我在D盘新建了一个文件夹,并把这个文件夹在IIS里设置成为虚拟目录:“SmartClient”。

然后在我刚才的新建文件夹里再新建一个a.htm文件和一个“bin”文件夹(来放我刚才编译好的DLL文件)。

然后把刚才编译好的DLL文件复到这个“bin”文件夹里。

a.htm文件的代码如下:

<html>

<head>

<title>Window控件在Web的试</title>

</head>

<body >

<object id="obj1" classid="http:bin/SmartClient1.dll#SmartClient1.UserControl1" VIEWASTEXT>

</object>

</body>

</html>

//http:bin/SmartClient1.dll#SmartClient1.UserControl1的意思,我在引用的文件里有说明,大家可以参考。而且刚才也应该看了。

好了。现在可以打开“http://localhost/SmartClient/a.htm”试一下:)

效果图如下:

那现在我们更多回一点儿内容上去:

新建一个窗体文件,把窗体文件通过刚才那个按钮控件点出来。(我刚才把Form1.cs给删了,我只得重建一个。)

代码基本上没有改动。

只是给Button1加了一个单击事件:

this.button1.Click += new System.EventHandler(this.button1_Click);

private void button1_Click(object sender, System.EventArgs e)

{

new Form1().Show();

}

新建的窗体文件我什么代码都没有加也没有减,原样。所以这里就不放代码了。

再编译一下。把DLL文件复到过去。记得把原来的删掉先。或是盖了它。

然后把原来的网页关掉。因为DLL换了一个WEB页一定要清理掉原来的缓存。所以得新开一张新的IE。

在打开新的IE里。不要选地址栏里智能显示给你的历史地址。那样你还只是会加载原来的控件,因为它还留在历史缓存里。

好,现在试一下看!成功了。我点那个按钮,那个Window窗体出现了(你觉得这意味着什么?)。

效果图如下:

至于开发者大会上讲的那个智能客户端我就不讲了。不过里面有一个小小的问题(上次我看过的一篇文章里也讲过)。我讲一下。就是你在WEB上点那个.exe文件时,会被下载工具给弄到下载列表里了。而你只能把下载工具给删掉:)

通过我上讲的用一个放在WEB上的控件来运于一个Window的办法,或许可以试试。就是在WEB上做一上启运控件,来启动这个系统。

你可以起动一个窗体,也可以起动一个exe线程(这个我在WEB里没有试过,而我又忘了如何启动所以在这之前我也没有办法试)。

至于.net framework安全配置方面。因为网上已经有一些非常好的文章了。我就不讲了,而且上面引用的文件里也说到过。之后我会在我的Bolg里贴出它们的URI。

第一次写稿,真是非常不好意思。都不知道怎么弄才好:)

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航