shensr

软件推动科技,科技改变世界!

博客园 首页 新随笔 联系 订阅 管理
  14 Posts :: 17 Stories :: 95 Comments :: 0 Trackbacks

在.Net Form中加载ActiveX控件非常方便,最符合官方的(也是最简单的)方法就是在VS.Net的Toolbx中加入ActiveX控件,然后便OK。

.Net有个ComVisible属性,要在ActiveX Form中访问.Net Control还是比较方便。然而要加载在ActiveX Form中呢?却无论如何也没有找到一种官方的方法。也许有朋友要说“谁这么变态,要在ActiveX Form中加载.Net Control?”……我们的一个实际的项目便有这样的需求!没办法,还得绞尽脑汁想招……

抛开跨平台的概念,我们知道在Windows下,.Net Control归根结底还是一个系统Window,与其他Window一样,也有Window Handle……对了,有了Window Handle我们不就可以#$%@。马上做实验,果然一切工作良好。不过还有一个问题,有些情况下Window的Handle会改变(比如改变RightToLeft属性),这时.Net Control就会失去Parent(试试我的例子)。但是一般情况下,谁会去改变RightToLeft属性呢,因此我们的方法基本上Work。

下载: Load NetControl in VB.zip


posted on 2004-06-08 13:03 shensr 阅读(2389) 评论(7) 编辑 收藏

评论

不错。有参考价值。

 回复 引用   

#2楼 2004-06-08 13:44 lostinet[未注册用户]
http://blog.joycode.com/lostinet/posts/24029.aspx
 回复 引用   

#3楼 2004-06-11 00:32 Ying-Shen Yu
确实网上有文章介绍如何将Winform Control 作为一个ActiveXcontrol host在vb6中,但是请不要这样使用。由于VB6不是一个经过测试合格的Winform Control Container,它们之间的交互(尤其在某些资源的获取和释放协定上存在一些差异) 一个比较典型的现象是在host一个实际的控件时,程序运行时一切正常,但在关闭时crash。

还有我想您在host 一个 User Control的时候可能需要解决"Tab“键切换焦点的问题i吧。

 回复 引用   

#4楼 2004-06-14 17:41 shensr
没错,这种方式确实有一些问题,除了楼上兄弟所指出的两个问题外,还有一个:在文本输入框等一些标准控件中不响应左右、上下键。

关于crash的问题,我在实际项目中通过SetUnhandledExceptionFilter来屏蔽掉错误对话框 ---- 实在是无奈之举!

关于不响应左右、上下键的问题,我创建了一个activex控件来作为.Net Control和vb6 form之间的桥梁,同时修改其注册表MiscStatus项的值(具体值我有点忘了)来解决了该问题!

实话实说,我自己也认为这不是一种完美的方式,不过在没有其他更好方法的时候,这一方式还是可以被接受的!

 回复 引用   

#5楼 2004-06-17 09:20 Ying-Shen
关于 Tab键和方向键的焦点切换问题,这是Modeless Dialog中加入container control 时需要注意判断是消息是发送给Dialog的,这是一个Win32编程的问题,不是WinForm或者ActiveX 的bug.你可以参考:下面这个google link:
http://groups.google.co.jp/groups?hl=en&lr=&ie=UTF-8&threadm=7lXK0uYMEHA.3464%40cpmsftngxa10.phx.gbl&rnum=1&prev=/groups%3Fq%3D%2522Ying-Shen%2522%2BIsDialogMessage%26ie%3DUTF-8%26hl%3Den%26btnG%3DGoogle%2BSearch

找不到的话直接看KB也可以:
Q233263 - PRB: Modeless Dialog Box in a DLL Does Not Process TAB Key 
<http://support.microsoft.com/default.aspx?scid=kb;en-us;233263> 
具体的解释在 Platform SDK "Using Dialog Box"

 回复 引用   

#6楼 2004-06-22 13:17 shensr
非常感谢楼上兄弟的指点,这样的确很好的解决了Tab键和方向键的问题!但是又遇到了一个新问题:在文本框敲其他键(如1),会冒出4个1出来,通过Spyxx查看,消息序列是:
WM_KEYDOWN
WM_CHAR
WM_CHAR
WM_KEYUP

比正常情况多一个WM_CHAR(怎么会多冒出3个1呢?)

 回复 引用   

#7楼 2005-06-30 01:36 Johnlee
我现在遇到一个棘手的问题,想请问各位高手-
如何在 VB.Net FrameWork 下禁用控件的上下左右键呢?
急用,在线等回……

 回复 引用