分享
 
 
 

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

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

首先引用Microsoft Windows 窗体快速入门教程上的文章"在 Internet Explorer 中使用 Windows 窗体控件":(如果引用的一些信息无法正常显示,请直接上面上的链接查看)

本主题描述如何在 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。

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有