研究了一阵子C#版WorldWind,大家知道WorldWind是桌面程序,突然提了一个新需求,就是在IE里面运行WorldWind,对于java版的WorldWind来说可能比较容易,C#版的还真费神,我的做法是把WorldWindow以及自己的写的插件全部封装在一个winform自定义控件中,然后再把这个控件加载到webform上,效果非常好。
现在写一个简单的例子总结一下winform自定义控件在webform上使用的步骤。
一、制作winform自定义控件。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;![](/Images/OutliningIndicators/None.gif)
using System.Runtime.InteropServices;![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
namespace EventSourceCtrl![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{ ![](/Images/OutliningIndicators/InBlock.gif)
public delegate void Start(Boolean Restart);
public delegate void Stop();
public delegate void Pause();![](/Images/OutliningIndicators/InBlock.gif)
[GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface ButtonEvents![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
[DispId(0)]
void DoStart(Boolean Restart);
[DispId(1)]
void DoStop();
[DispId(2)]
void DoPause();
}![](/Images/OutliningIndicators/InBlock.gif)
public interface IDoNetEventInScript![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
void SetCaption(string Value);
}![](/Images/OutliningIndicators/InBlock.gif)
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(ButtonEvents))]
[Guid("5649B9CC-07BA-432a-A392-532EE2AFD190")]
public partial class sourceCtrl : UserControl, IDoNetEventInScript![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ ![](/Images/OutliningIndicators/InBlock.gif)
public event Start DoStart;
public event Stop DoStop;
public event Pause DoPause;![](/Images/OutliningIndicators/InBlock.gif)
public sourceCtrl()![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
InitializeComponent();
}![](/Images/OutliningIndicators/InBlock.gif)
private void button1_Click_1(object sender, EventArgs e)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (DoStart != null)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DoStart(true);
}
}![](/Images/OutliningIndicators/InBlock.gif)
private void button2_Click(object sender, EventArgs e)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (DoPause != null)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DoPause();
}
}![](/Images/OutliningIndicators/InBlock.gif)
private void button3_Click(object sender, EventArgs e)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (DoStart != null)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DoStart(false);
}
}![](/Images/OutliningIndicators/InBlock.gif)
private void button4_Click(object sender, EventArgs e)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (DoStop != null)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DoStop();
}
}![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IDoNetEventInScript 成员#region IDoNetEventInScript 成员![](/Images/OutliningIndicators/InBlock.gif)
public void SetCaption(string Value)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
label1.Text = Value;
}![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
}
超级简单的一个例子,没什么好说的,要注意的是控件类前面的几个属性[ComVisible(true)]和[Guid("5649B9CC-07BA-432a-A392-532EE2AFD190")]是必须的。
二、用Visual Studio 2005命令提示注册控件到全局缓存,注意用windows的cmd.exe进行注册不行,不认识命令。
注册命令是:regasm /codebase fullpath,其中codebase是必须的,要不然即使注册成功也不会在IE上显示。如图:
![](https://images.cnblogs.com/cnblogs_com/salonliudong/winformregasm.jpg)
三、将注册好的控件放在网页上
< html >
< head >
< title > DotNetEventInScript </ title >
</ head >
< body >
< object id = "eventSource" classid ="clsid:5649B9CC-07BA-432a-A392-532EE2AFD190" width =100% height =100% align =alClient >
</ object > ![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
< script type ="text/javascript" >
function eventSource::DoStart(Restart)![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
alert("DoStart");
}
function eventSource::DoStop()![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
alert("DoStop");
}
function eventSource::DoPause()![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
alert("DoPause");
}
</ script >
</ body >
</ html > 测试看看,效果不错吧!