ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:166.57KB ,
资源ID:2914104      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2914104.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(用VB调用C#写的NET控件.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

用VB调用C#写的NET控件.docx

1、用VB调用C#写的NET控件虽然IT开发技术日新月异,不过业界仍然运行着大量的VB系统,这些系统凝聚了不少客户的投资,应当要一定程度的保护和利用。因此也就产生了一种 需求,也就是使用旧的开发技术仍然可以使用新技术的产出。本文就讨论如何在VB6.0开发中使用上WinForm.NET控件。袁永福版权所有二软件原理:运行VB IDE,打开或创建一个EXE工程,打开窗体设计器,如下图所示:为了能在窗体上添加控件,需要往窗体左边的工具箱上添加项目,需要点击菜单项目“Project-Components”,此时会弹出如下图所示的对话框:点击“Browse”按钮,弹出文件选择对话框,这个对话框中优先选择OC

2、X文件,而C#编译结果绝不可能是OCX文件的,此时即使选择一 个.NET程序集DLL文件,无论如何必然会报错“This file not registerable as an ActiveX Component”。袁永福版权所有因此也就是说,使用C#开发的WinForm.NET控件是不可能直接通过传统的模式放置在VB窗体上。不过VB仍然可以通过COM方式调用.NET程序集中的对COM公开的类型。此时就可以想出一种曲线实现方式,那就是VB创建C#组件,该组件 是一个WinForm.NET控件,然后调用Win32API SetParent函数,将WinForm.NET控件硬塞入VB窗体中。这样在用

3、户界面上,用户能看到和使用WinForm.NET控件;在后台,VB 代码能访问.NET组件提供的公开的属性、方法和事件,实现了VB全方位的调用WinForm.NET控件。三C#开发C#控件开发根据上述的软件原理,笔者开发一个WinForm.NET控件并成功的应用于VB6.0的开发中,现对软件进行说明。这个WinForm.NET控件名为MyWinFormControl,派生自 System.Windows.Forms.UserControl类型,它包含在一个名为DCWinFormControlLib的C#项目中,项目输 出类型为类库,目标框架为.NET2.0,添加了对System.Windows

4、.Forms.dll的引用。界面设计:MyWinFormControl控件的用户界面设计如下:在界面上放置一个名为“btnAction”的按钮,一个名为“myTextBox”的文本框。定义公开属性和方法:打开该控件的C#代码文件,可以看到声明该类型的C#代码如下:System.Runtime.InteropServices.ComVisible(true)System.Runtime.InteropServices.Guid(60550064-C97F-4306-A8B2-6908F50780E3)System.Runtime.InteropServices.ComSourceInterfac

5、es(typeof(IComMyEvent)public partial class MyWinFormControl : UserControl这段代码中,第一行代码的ComVisible标记类型为COM公开的;第二行代码Guid标记了类型在COM中的唯一编号;第三行代码的ComSourceInterfaces指明该类型实现了名为IComMyEvent的事件接口。袁永福版权所有VB中无法直接绑定编译阶段未知的控件事件,同时也无法直接感应C#中的事件,为此需要编写一个接口通知VB存在若干事件,使得VB能绑定事件。因此在此定义了IComMyEvent接口,声明了C#控件中的事件,IComMyEv

6、ent接口定义如下using System.Runtime.InteropServices;Guid(096EF9A6-24CB-4091-A18F-34DA38C9A6F1)ComVisible( true )InterfaceType( ComInterfaceType.InterfaceIsIDispatch )public interface IComMyEvent / / 按钮按下事件 / DispId(12340) void ComButtonClick(); / / 文本内容修改事件t / DispId(12350) void ComTextChanged();/ / 无参数无返

7、回值委托类型/ public delegate void VoidEventHandler();而后在控件的C#代码中添加以下代码:#region 实现 IComMyEvent 中的成员/ / 按钮按下事件/ public event VoidEventHandler ComButtonClick = null;/ / 文本内容修改事件/ public event VoidEventHandler ComTextChanged = null;#endregion这样C#中定义的事件在VB中就能绑定了,以下代码就是触发这些事件的:private void btnAction_Click(obje

8、ct sender, EventArgs e) if (ComButtonClick != null) / 触发ComButtonClick事件 ComButtonClick(); private void myTextBox_TextChanged(object sender, EventArgs e) if (ComTextChanged != null) / 触发ComTextChanged事件 ComTextChanged(); 对控件实现了COM公开的事件后,就可以编写COM公开的属性和方法,其代码如下:/ / 公开的属性/ public string UserText get re

9、turn myTextBox.Text; set myTextBox.Text = value; / / 公开的方法/ public double Calcute(double p) return Math.Sin(p);这个用户控件虽然能在VB代码中创建和访问,但还不能直接拖放到VB窗体上,此时还需要使用代码将C#控件添加到VB窗体上:/ / 将控件添加到指定句柄的窗体中/ / 指定的窗体句柄对象/ 操作是否成功public bool AppendToContainerControl(int containerHandle) CrossPlatformControlHostManager m

10、an = new CrossPlatformControlHostManager(); man.ContainerHandle = new IntPtr(containerHandle); man.ControlHandle = this.Handle; man.Dock = this.Dock; return man.UpdateLayout();在这个函数中,参数为VB窗体中某个控件的句柄,该控件用于承载C#控件。这段代码使用了笔者编写的一个 CrossPlatformControlHostManager类型,该类型专业用于执行跨应用程序的控件承载,实现“乾坤大挪移”,该类型首先定义了 几

11、个属性:袁永福版权所有private IntPtr _ControlHandle = IntPtr.Zero;/ / 操作的控件句柄对象/ public IntPtr ControlHandle get return _ControlHandle; set _ControlHandle = value; private IntPtr _ContainerHandle = IntPtr.Zero;/ / 容器元素对象/ public IntPtr ContainerHandle get return _ContainerHandle; set _ContainerHandle = value;

12、private DockStyle _Dock = DockStyle.Fill;/ / 停靠样式/ public DockStyle Dock get return _Dock; set _Dock = value; 此外还定义了一个方法,其代码如下:/ / 更新排版/ / 操作是否成功public bool UpdateLayout() WindowInformation info = new WindowInformation(this.ControlHandle); WindowInformation container = new WindowInformation(this.Con

13、tainerHandle); if (info.CheckHandle() = false | container.CheckHandle() = false) return false; if (info.ParentHandle != container.Handle) if (info.SetParent(container.Handle) = false) return false; Rectangle clientRect = container.ClientBounds; Rectangle bounds = info.Bounds; Rectangle descBounds = bounds; switch (this.Dock) case DockStyle.Fill: descBounds = clientRect; break; case DockStyle.Bottom: descBounds = new Rectangle( 0, clientRect.Height - bounds.Height, clientRect.Width, bound

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1