在IE中使用VS.net WinForm控件

控件

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

时间: 2024-11-02 22:05:43

在IE中使用VS.net WinForm控件的相关文章

字符串转化为winform控件名

问题描述 字符串转化为winform控件名 c++在vs2005中字符串转化为winform控件名, c++在vs2005中字符串转化为winform控件名, 解决方案 Control c = this.Controls["空间名"]; 解决方案二: Control c = this.Controls["空间名"]; 解决方案三: Control c = this.Controls["控件名"]; Control c再AS成实际的控件对象 解决方

如何在winform中动态添加或删除控件

问题描述 如何在winform中动态添加或删除控件,多谢了 解决方案 解决方案二:本帖最后由 caozhy 于 2012-05-24 22:26:07 编辑解决方案三://添加控件TextBoxtxt=newTextBox();txt.Text="我是自动添加的";txt.Location=newPoint(10,10);this.Controls.Add(txt);//移除控件this.Controls.Remove(txt);txt.Dispose();解决方案四:privatev

c#中使用多线程访问winform中控件的若干问题

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我 们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(Threa

c#扩展方法奇思妙用高级篇六:WinForm控件选择器

我们先看几个类图,深入认识一下我们常用的WinForm控件: 图1 ScrollableControl类图 图2 ButtonBase类图 图3 TextBoxBase类图 图4 ListControl类图 图5 Label类图 图6 其它常用 从图1中可以看出,Form与Button.Label一样,也是一个Control.

WinForm控件开发总结(十) 为属性设置默认值

本系列的前面几篇文章讲解了如何来定义属性以及更有效的编辑属性,接下来我要讲一下控件属性的默 认值.如果我们希望自己开发的控件更易于被其它开发者使用,那么提供默认值是非常值得的. 如果你为属性设定了默认值,那么当开发者修改了属性的值,这个值在Property Explorer中将会以粗 体显示.VS为属性提供一个上下文菜单,允许程序员使用控件把值重置为默认值.当VS进行控件的串行化 时,他会判断那些值不是默认值,只有不是默认值的属性才会被串行化,所以为属性提供默认值时可以大 大减少串行化的属性数目

WinForm控件开发总结(七) 为复杂属性的子属性提供编辑功能

前面的几篇文章中,我们给控件添加一个复杂的类型Scope,并且给它的类型提供的一个类型转换器, 现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了.但是你有没有发现,在 属性浏览器里编辑这个属性的值还是不太方便.因为属性只是"10,200"这种形式的,所以,你必须按 照这种格式来修改,一旦格式错误就会引发异常,比如输入一个"10200".我们期望这个属性的每一子 属性都能够被独立的编辑就好了,这并非不能实现,而且实现还很简单. 为了在属性浏览器里

WinForm控件开发总结(五) 为控件的复杂属性提供类型转换器

上一篇文章我已经介绍了TypeConverterAttribute元数据的作用,本文将通过代码向你展示具体的实 现.在这个例子中,我要给控件添加一个复杂的属性,这个属性对这个控件没有什么功用,纯粹是为了演 示,有些牵强附会了. 现在在前一篇文章中的创建的控件代码中添加一个Scope属性: [Browsable(true)] public Scope Scope { get { return _scope; } set { _scope = value; } } 这个属性的类型是Scope类,代码

WinForm控件开发总结(四) 控件属性的串行化

前一篇文章介绍了常用的设计时Attribute.其中BrowsableAttribute,CategoryAttribute, DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比较简单的,也是可 有可无,但是为了提供更好的用户体验这些Attribute最好不要省掉,如果你对这些Attribute还不熟悉, 可以参考我前一篇文章的描述或者查看MSDN,这里我就不在赘述了. 下来我们主要介绍一下Designer

WinForm控件开发总结(三) 认识WinForm控件常用的Attribute

在前面的文章里我们制作了一个非常简单的控件.现在我们回过头来看看这些代码透露出什么信息. 这个类是直接从Control类派生出来的,自定义控件都是直接从Control类派生出来的.这个类定义了 一个属性TextAlignment,用来控制文本在控件中显示的位置: [ Category("Alignment"), Description("Specifies the alignment of text.") ] public ContentAlignment Text