首先引用Microsoft Windows 窗體快速入門(mén)教程上的文章"在 Internet Explorer 中使用 Windows 窗體控件":(如果引用的一些信息無(wú)法正常顯示,請直接上面上的鏈接查看)
本主題描述如何在 Internet Explorer (IE) 內成功地執行 Windows 窗體控件。IE 內的 Windows 窗體控件無(wú)需用戶(hù)提示即可激活,它不要求注冊,而且利用公共語(yǔ)言運行庫 (CLR) 代碼訪(fǎng)問(wèn)安全性。
在 Internet Explorer 內激活 Windows 窗體控件需要五步,這里列出了每一步,并在下面詳細介紹。
創(chuàng )建 Windows 窗體控件。
創(chuàng )建帶有 object 標記的 HTML 文檔。
創(chuàng )建虛擬目錄并設置權限。
運行該控件。
創(chuàng )建 Windows 窗體控件
在 Internet Explorer 中幾乎可以承載任何 Windows 窗體控件,但是對于此示例,我們將承載本快速入門(mén)教程的創(chuàng )建控件部分中包含的 SimpleControl。該控件必須安裝到全局程序集緩存中或者與包含它的 Web 頁(yè)位于同一虛擬目錄中。
創(chuàng )建帶有 object 標記的 HTML 文檔
下一步是創(chuàng )建帶有 object 標記的 HTML 文檔,該標記引用 Windows 窗體控件。對于此示例,還將添加一些簡(jiǎn)單的腳本和輸入標記,以演示對該控件進(jìn)行編程訪(fǎng)問(wèn)。
<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 有兩個(gè)令人感興趣的部分:指向控件庫的路徑和控件的完全限定名,這兩者由 # 號分隔開(kāi)。如果您熟悉 ActiveX object 標記,將注意到缺少一個(gè) guid。在 Windows 窗體中,路徑和完全限定類(lèi)名的組合作為唯一標識符。
Param 標記可用于設置控件上的屬性。在這種情況下,name 特性是屬性的名稱(chēng),value 特性是屬性的值。
<script>
function ChangeText() {
simpleControl1.Text = text1.value;
}
</script>
-
<input type="text" id="text1">
<input type="button" value="Change Text" onclick="ChangeText()">
若要獲取對控件的編程訪(fǎng)問(wèn),可以針對該控件編寫(xiě)腳本。將該頁(yè)上的按鈕和文本框與簡(jiǎn)單 JScript 函數 ChangeText 一起使用來(lái)設置控件的 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>
創(chuàng )建虛擬目錄并設置權限
該 HTML 頁(yè)必須駐留在 Web 服務(wù)器上的 IIS 虛擬目錄中,而且必須具有相應的權限。在此示例中,Windows 窗體控件駐留在同一目錄中,但它也可以安裝到全局程序集緩存中。虛擬目錄上的執行權限必須設置為 scripts,如果執行權限設置為 scripts & executables,則將無(wú)法正確激活該控件。對于此示例,已經(jīng)為您執行了這些步驟。
運行該控件
若要運行該控件,只需將 Internet Explorer 指向虛擬目錄中的該 HTML 頁(yè)。如果該控件沒(méi)有正確激活,可能需要重新啟動(dòng) Internet Explorer。
///////////////////////////////////////////////////////////////////////////////
//引用結束
自從我上次看了MSDN的WebExc活動(dòng)上小陳在webcast_asp.net_2(也就是asp.net技巧2)里演示的在網(wǎng)頁(yè)里放上window程序的所謂Smart Client(不知道有沒(méi)有單詞寫(xiě)錯了),我就老是睡不著(zhù)覺(jué)。怎么型呢?
而且老是重復的看小陳打開(kāi)的那兩個(gè)原代碼的圖片:
那,小陳的這個(gè)代碼跟上面引用的那個(gè)文章里的:
<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>
可以說(shuō)是一樣的。
以前,我并沒(méi)有十分注意的去看window forms快速入門(mén)的文章。我記得我以前是看過(guò)那些的文章。但是我一直都是開(kāi)發(fā)B/S為主,所以就算是看了也因為沒(méi)有應用起來(lái)而忘了。//話(huà)外
于是我按照快速入門(mén)的示例代碼完全一樣的做了一個(gè)。
成功了!
心里感覺(jué)特別的興奮,就算是半夜了我也要繼續搞下去。
我就自己開(kāi)始做了……
我第一個(gè)放上去的是,把一個(gè)正常情況寫(xiě)出來(lái)的窗體。
顯示不出來(lái),我暈了。為什么顯示不出來(lái)啊。我也是按上面的意思做的??!
我又把自己的代碼看了好幾遍,沒(méi)錯的,可就是沒(méi)戲。
//我后來(lái)的摸索才發(fā)現,窗體是不能放上去的,而只能放控件
請再參考一下上小陳上次演示的程序圖片:
這個(gè)圖片中(左為web上的,左為window),你會(huì )發(fā)現小程演示時(shí)的window窗體跟web上那個(gè)有一點(diǎn)點(diǎn)不一樣:就是winow上多了一個(gè)“Game”菜單。
所以它是一個(gè)窗體文件(控件上不能放MainMenu控件)。而不是控件。而菜單下面的那個(gè)就是了。所以它才能被分離出來(lái)放在web上(放在web上的應該是用戶(hù)控件或是自定義控件)。
我原先以為,小陳那個(gè).exe文件放上去。是一個(gè)應用程序的Main()函數起動(dòng)的。
我再說(shuō)一次窗體文件是不能放上去的?;蛘f(shuō)所有繼承自Form的文件都不放上去。(原因我還不知道。我過(guò)去一直是搞b/s的。呵呵。)
自把窗體文件放上去失敗之后,我又試了很多次把控件放上去。當中的失敗我就不多講了。我把摸索出來(lái)的一些可能對大家有用的東西給大家分享。
1。在這里我建議大家用“用戶(hù)控件”先玩一玩:用它比較方便。自定議控件的操作有點(diǎn)兒不可視化。但是,只要是控件都是可以的。
2??丶a里的一部份代碼要刪掉!
新建一個(gè)用戶(hù)近件的默認代碼是:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace WindowsApplication3
{
/// <summary>
/// UserControl1 的摘要說(shuō)明。
/// </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 );
}//這個(gè)方法需刪掉
#region 組件設計器生成的代碼
/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器
/// 修改此方法的內容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();//需刪掉,不過(guò)你只要在設計器里拉一個(gè)控件,它就會(huì )沒(méi)有了。
}
#endregion
}
}
如果不去掉的話(huà)會(huì )無(wú)法在Web上正常運行。去掉后的代碼:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace WindowsApplication3
{
/// <summary>
/// UserControl1 的摘要說(shuō)明。
/// </summary>
public class UserControl1 : System.Windows.Forms.UserControl
{
/// <summary>
/// 必需的設計器變量。
/// </summary>
public UserControl1()
{
// 該調用是 Windows.Forms 窗體設計器所必需的。
InitializeComponent();
// TODO: 在 InitializeComponent 調用后添加任何初始化
}
#region 組件設計器生成的代碼
/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器
/// 修改此方法的內容。
/// </summary>
private void InitializeComponent()
{
}
#endregion
}
}
原因問(wèn)題我也不是很明白。但是資源清理的話(huà),我想,控件加載后是放在web的緩存里的。一但關(guān)掉。緩存里的數據也就沒(méi)有了//我對windows方面不熟悉,所以可能講得很錯誤:)
3。在web上的window控件不能以XP的風(fēng)格運行(或許可以,但是我弄了好久也沒(méi)戲,畢竟我是window外行。誰(shuí)弄出來(lái)了一定要貼出來(lái)共享)
4。項目不管是編譯成.exe或是.dll文件都是可以的.
好了,現在我們開(kāi)始來(lái)做一個(gè)試試。
新建一個(gè)C#窗口項目,名字隨便取,我取了個(gè):SmartClient1
項目里的Form1.cs文件,你不喜歡就把它刪掉也可以。我是把它刪除了。
然后新建一個(gè)用戶(hù)控件:UserControl1.cs文件。
在它上面隨便拉一個(gè)控件出來(lái)上去。我是拉了一個(gè)button控件。
然后我改了一下背景色和控件的背景色。
全部代碼如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace SmartClient1
{
/// <summary>
/// UserControl1 的摘要說(shuō)明。
/// </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文件)
下一步我們來(lái)建立調用它的html頁(yè)。
要建之前我在D盤(pán)新建了一個(gè)文件夾,并把這個(gè)文件夾在IIS里設置成為虛擬目錄:“SmartClient”。
然后在我剛才的新建文件夾里再新建一個(gè)a.htm文件和一個(gè)“bin”文件夾(來(lái)放我剛才編譯好的DLL文件)。
然后把剛才編譯好的DLL文件復到這個(gè)“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的意思,我在引用的文件里有說(shuō)明,大家可以參考。而且剛才也應該看了。
好了?,F在可以打開(kāi)“http://localhost/SmartClient/a.htm”試一下:)
效果圖如下:
那現在我們更多回一點(diǎn)兒內容上去:
新建一個(gè)窗體文件,把窗體文件通過(guò)剛才那個(gè)按鈕控件點(diǎn)出來(lái)。(我剛才把Form1.cs給刪了,我只得重建一個(gè)。)
代碼基本上沒(méi)有改動(dòng)。
只是給Button1加了一個(gè)單擊事件:
this.button1.Click += new System.EventHandler(this.button1_Click);
private void button1_Click(object sender, System.EventArgs e)
{
new Form1().Show();
}
新建的窗體文件我什么代碼都沒(méi)有加也沒(méi)有減,原樣。所以這里就不放代碼了。
再編譯一下。把DLL文件復到過(guò)去。記得把原來(lái)的刪掉先?;蚴巧w了它。
然后把原來(lái)的網(wǎng)頁(yè)關(guān)掉。因為DLL換了一個(gè)WEB頁(yè)一定要清理掉原來(lái)的緩存。所以得新開(kāi)一張新的IE。
在打開(kāi)新的IE里。不要選地址欄里智能顯示給你的歷史地址。那樣你還只是會(huì )加載原來(lái)的控件,因為它還留在歷史緩存里。
好,現在試一下看!成功了。我點(diǎn)那個(gè)按鈕,那個(gè)Window窗體出現了(你覺(jué)得這意味著(zhù)什么?)。
效果圖如下:
至于開(kāi)發(fā)者大會(huì )上講的那個(gè)智能客戶(hù)端我就不講了。不過(guò)里面有一個(gè)小小的問(wèn)題(上次我看過(guò)的一篇文章里也講過(guò))。我講一下。就是你在WEB上點(diǎn)那個(gè).exe文件時(shí),會(huì )被下載工具給弄到下載列表里了。而你只能把下載工具給刪掉:)
通過(guò)我上講的用一個(gè)放在WEB上的控件來(lái)運于一個(gè)Window的辦法,或許可以試試。就是在WEB上做一上啟運控件,來(lái)啟動(dòng)這個(gè)系統。
你可以起動(dòng)一個(gè)窗體,也可以起動(dòng)一個(gè)exe線(xiàn)程(這個(gè)我在WEB里沒(méi)有試過(guò),而我又忘了如何啟動(dòng)所以在這之前我也沒(méi)有辦法試)。
至于.net framework安全配置方面。因為網(wǎng)上已經(jīng)有一些非常好的文章了。我就不講了,而且上面引用的文件里也說(shuō)到過(guò)。之后我會(huì )在我的Bolg里貼出它們的URI。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。