在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,在你的控件上画画线吧