首先引用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。