在IE中使用VS.net WinForm控件
2024-07-10 13:01:20
供稿:網友
在visual studio .net中,類似于applet或activex控件,winform控件可以嵌入ie中使用。嵌入ie的windows窗體控件不要求注冊,不需用戶提示即可激活。我們可以很方便地實現一些webform中實現起來相對麻煩的交互操作,結合.net remoting等技術訪問后臺數據庫,則可生成功能強大而且美觀的webform頁面。
使用該技術,需要客戶端安裝.net framework及ie 6.0,在windows 2003中已經自帶了.net framework。
嵌入webform的winfrom控件利用公共語言運行庫代碼訪問安全性,一些特殊操作還需要設置訪問權限。
下面就讓我們做個簡單的例子,在winform用戶控件中使用gdi+實現畫線功能,并把它嵌入ie瀏覽器。
開發環境:windows 2000專業版、visualt studio .net 2002
1.創建winform用戶控件
我們可以建立一個“windows控件庫”項目,最后嵌入瀏覽器時只需要生成的dll文件。但為了方便調試,我們可以先把控件嵌入winform中。
新建“windows應用程序”,名稱為winforminwebform,生成的解決方案也名稱為winforminwebform。在解決方案中再添加一個“windows控件庫”項目winformcontrol,系統在該項目中自動添加一個了usercontrol1的用戶控件,刪除該控件,然后在“windows控件庫”項目中添加一個用戶控件winformgdictrl。
現在我們先把該控件加如“windows應用程序”的form1中。
首先需要生成解決方案以生成控件的dll文件。然后打開工具箱,點右鍵選擇“添加選項卡”,在工具箱中添加一個“winform控件”選項卡。在該選項卡上點右鍵,選擇“自定義工具箱”,彈出自定義工具箱頁面。切換到.net框架組件頁面,單擊瀏覽,到“/winformcontrol/bin/debug”目錄選擇winformcontrol.dll文件,打開后在“winform控件”選項卡里就會出現winformgdictrl控件,這時就可以把該控件拖動到form1上了。
打開winformgdictrl.cs文件,我們可以看到winformgdictrl類繼承自system.windows.forms.usercontrol。
由于我們要使用gdi+繪圖,為防止由控件重繪引起的閃爍,我們可以啟用雙緩沖,指定控件的controlstyles.doublebuffer為true。要完全啟用雙緩沖,必須也要將 userpaint 和 allpaintinginwmpaint位數設置為 true。在構造函數中加入
public winformgdictrl()
{
initializecomponent();
this.setstyle(controlstyles.userpaint,true);
this.setstyle(controlstyles.allpaintinginwmpaint,true);
this.setstyle(controlstyles.doublebuffer,true);
}
添加一個類lineobj,用于保存線對象,并給該類添加一個draw方法用于畫線
using system;
using system.drawing;
namespace winformcontrol
{
public class lineobj
{
public point m_startpoint; //起始點
public point m_endpoint; //截止點
public lineobj(int x,int y)
{
m_startpoint=new point(x,y);
m_endpoint=new point(x,y);
}
public void draw(graphics g)
{
g.drawline(new pen(color.blue,2),m_startpoint,m_endpoint);
}
}
}
在winformgdictrl類中添加兩個類變量
private arraylist m_arraylines;
private bool m_bdrawing;
m_arraylines為線對象集合,m_bdrawing指示是否畫線。
并在類構造函數中初始化變量
m_arraylines=new arraylist();
m_bdrawing=false;
給控件添加mousedown,mousemove,mouseup及paint事件響應函數
private void winformgdictrl_mousedown(object sender, system.windows.forms.mouseeventargs e)
{
lineobj m_lineobj=new lineobj(e.x,e.y);
m_arraylines.add(m_lineobj);
m_bdrawing=true;
}
private void winformgdictrl_mousemove(object sender, system.windows.forms.mouseeventargs e)
{
if(m_bdrawing)
{
lineobj m_lineobj=(lineobj)m_arraylines[m_arraylines.count-1];
m_lineobj.m_endpoint=new point(e.x,e.y);
this.invalidate();
}
}
private void winformgdictrl_mouseup(object sender, system.windows.forms.mouseeventargs e)
{
m_bdrawing=false;
}
private void winformgdictrl_paint(object sender, system.windows.forms.painteventargs e)
{
graphics g=e.graphics;
g.fillrectangle(brushes.yellow,this.clientrectangle);
foreach(object obj in m_arraylines)
{
lineobj m_lineobj=(lineobj)obj;
m_lineobj.draw(g);
}
}
生成解決方案,運行form1,你就可以看到控件的效果了
打開/winformcontrol/bin/debug目錄,其中的winformcontrol.dll就是我們所需要的
2.把控件嵌入ie瀏覽器
新建一個虛擬目錄winformctrl,把winformcontrol.dll文件復制進該目錄中,再在該目錄中創建一個帶有object標記的html文件test.htm
<html>
<head>
</head>
<body>
<object id="drawcontrol" classid="http:winformcontrol.dll#winformcontrol.winformgdictrl" height=300px width=400px viewastext></object>
</body>
</html>
其中我們關心的是objcect標記的classid,classid分為兩部分:控件名(可包括路徑)和控件的完全限定名,中間用“#”相隔。完全限定名由“命名空間.類名”組成
從示例來看
winformcontrol.dll為控件名,winformcontrol為控件命名空間,winformgdictrl為控件類名。
打開ie,在地址欄輸入http://localhost/winformctrl/test.htm,在你的控件上畫畫線吧