VB6 的开发环境在现代操作系统上难以直接安装运行,网上有一些解决方案可以尝试一下,如果不行可以下载那种精简版本 VB6 —— 这个至少能跑起基本功能,或者可以安装一个 XP的虚拟机来运行 VB6。 2、在工具条里拖一个 Image 控件到默认的用户控件 UserControl1 上面。 '声明一个普通变量 Dim TestPropertyValue As Integer
'声明一个事件,在 aardio 中可以响应这个事件, '注意参数加了ByRef表示传址,在 aardio 中就可以修改这这个参数的值 Public Event OnImageClick(ByRef TestPropertyValue As Integer)
'这是VB6里点了Image图像控件触发的事件 Private Sub Image1_Click() '触发 COM 控件的事件( 换句话说就是调用 aardio 中的函数 ) RaiseEvent OnImageClick(TestPropertyValue) End Sub
'窗口调整大小触发这个函数,注意 aardio 控件都是非适应缩放的 Private Sub UserControl_Resize() Image1.Width = UserControl.Width Image1.Height = UserControl.Height End Sub
'定义读属性 TestProperty 的函数,这是带参数的属性 Public Property Get TestProperty(Param As Integer) As Integer TestProperty = TestPropertyValue + Param End Property
'定义写属性 TestProperty 的函数,带参数属性(参数要跟上面一致) Public Property Let TestProperty(Param As Integer, ByVal v As Integer) TestPropertyValue = v - Param End Property
'定义写属性 Picture 的函数,参数是一个 IDispatch 接口的 COM 对象 Public Property Let Picture(ByVal pic As Variant) Image1.Picture = pic End Property
'定义一个名为 Picture 的函数 Public Function Add(ByVal a As Integer, ByVal b As Integer) Add = a + b End Function
然后在 VB 里点击 IDE 主菜单“文件->生成 *.ocx ” 就可以了。
请注意第@2个参数的路径前有一个$字符,这会将 ocx 的二进制数据编译到代码里,发布后就不需要再带一个 ocx 了,VB的 ocx 并不支持内存加载,所以我们用 com.lite.appData() 函数将其自动复制到 %CommonAppData% 目录下,这个路径是全英文的,自动就解决了 VB6 控件遇到 Unicode 路径崩溃的大难题。 import com.lite; var dll = com.lite.appData('aardio\vb6\Vb6Control.ocx',$'\.vb6\Vb6Control.ocx') var vbUserControl = dll.createEmbedEx(winform.static); 非常简单,VB里怎么使用这个控件,在 aardio 里我们就怎么使用。其实我们可以在 dll.createEmbedEx() 的第@2个参数里指定 COM控件的 CLSID,但 VB 这个 CLSID 不好找,很多人是先注册控件再去注册表里查,问题是 VB6现在注册控件会报错失败 —— 不过好在 aardio 可以免注册调用 VB 控件,并且在 aardio 中可以省略 CLSID,aardio 会自己帮你找到正确的 CLSID 。这么贴心 —— 有没有被感动呢?!
然后使用这个 comObject 就行了,不过能不能不写这句代码呢?!其实也是可以的,这就是我使用 dll.createEmbedEx() 而非 dll.createEmbed() 的原因了,这两个函数作用相同,但带 Ex 后缀的 dll.createEmbedEx() 多了一个功能,他返回的控件容器对象已经自动实现了一个简单的 COM 控件代理 —— 例如上面访问 vbUserControl 对象的成员就会自动转为调用 vbUserControl._object 的成员,等于将COM控件容器与 COM对象合二为一了。 //控件容器也是默认的 COM 事件监听器,如下直接指定响应 COM 事件的函数 vbUserControl.OnImageClick = function(value){ winform.edit.print('VB控件里点击了图像,事件参数:'+value) //VB里这个事件的参数声明为 ByRef,所以添加返回值可以修改参数 return 100 } 是否还记得 VB6 里这个事件的参数指定为 ByRef 传址,也就是说参数 value 是一个引用参数,在 aardio 中可以修改他的值,aardio 基于纯函数原则不会直接修改外部参数的值,而是通过增加返回值修改引用参数的值。这个事件函数没有返回值,也只有一个需要输出值的引用参数,所以增加一个返回值就可以了。
其实就是调用 com.pictrue.load() 加载图像,再用 com.QueryObject() 转换为 COM 对象( IDispatch 接口 ) ,然后就可以传给 VB了: //修改VB控件的属性 vbUserControl.Picture = com.picture.loadObject( '~\codes\范例程序\D) 图形图像\.gdip.jpg' ) 反正我在繁体系统下测试 VB控件直接加载上面的图像会出问题,但用上面的方法 —— 用 aardio 加载图像再传给 VB6 就完美解决。
vbUserControl.TestProperty(2) = 123 千万别以为是给函数的返回值赋值,我们把上面的参数化属性赋值转换为 等价的 aardio 代码如下:
在 aardio 里给属性加上 set 前缀就可以变成一个写属性的函数,当然也就支持多个参数了。同理,加上 get 前缀可以变成一个读属性函数,如下: /* 带多个参数的属性加上get前缀并以函数形式调用,例如: */ var testProperty = vbUserControl.getTestProperty(2); 好吧下面我们看这个范例的完整 aardio 源码,直接复制就可以运行,直接复制就是一个独立的、完整的程序:
最后不得不佩服一下,这个 VB 控件的体积是:24KB,对比一下现在用 Electron 什么的没写几个功能就几百MB是什么概念,这几百MB里有多少是你真正需要的东西?!不是说这些东西没有用,就像豪华大房车一定是有用的,但你明明骑个自行车能解决的问题,非要每次都开豪华大房车吗?!想想这个道理,就会明白 VB6 的好处在哪里。 |
|