VB6 的開發(fā)環(huán)境在現(xiàn)代操作系統(tǒng)上難以直接安裝運行,網(wǎng)上有一些解決方案可以嘗試一下,如果不行可以下載那種精簡版本 VB6 —— 這個至少能跑起基本功能,或者可以安裝一個 XP的虛擬機(jī)來運行 VB6。 2、在工具條里拖一個 Image 控件到默認(rèn)的用戶控件 UserControl1 上面。 '聲明一個普通變量 Dim TestPropertyValue As Integer
'聲明一個事件,在 aardio 中可以響應(yīng)這個事件, '注意參數(shù)加了ByRef表示傳址,在 aardio 中就可以修改這這個參數(shù)的值 Public Event OnImageClick(ByRef TestPropertyValue As Integer)
'這是VB6里點了Image圖像控件觸發(fā)的事件 Private Sub Image1_Click() '觸發(fā) COM 控件的事件( 換句話說就是調(diào)用 aardio 中的函數(shù) ) RaiseEvent OnImageClick(TestPropertyValue) End Sub
'窗口調(diào)整大小觸發(fā)這個函數(shù),注意 aardio 控件都是非適應(yīng)縮放的 Private Sub UserControl_Resize() Image1.Width = UserControl.Width Image1.Height = UserControl.Height End Sub
'定義讀屬性 TestProperty 的函數(shù),這是帶參數(shù)的屬性 Public Property Get TestProperty(Param As Integer) As Integer TestProperty = TestPropertyValue + Param End Property
'定義寫屬性 TestProperty 的函數(shù),帶參數(shù)屬性(參數(shù)要跟上面一致) Public Property Let TestProperty(Param As Integer, ByVal v As Integer) TestPropertyValue = v - Param End Property
'定義寫屬性 Picture 的函數(shù),參數(shù)是一個 IDispatch 接口的 COM 對象 Public Property Let Picture(ByVal pic As Variant) Image1.Picture = pic End Property
'定義一個名為 Picture 的函數(shù) Public Function Add(ByVal a As Integer, ByVal b As Integer) Add = a + b End Function
然后在 VB 里點擊 IDE 主菜單“文件->生成 *.ocx ” 就可以了。
請注意第@2個參數(shù)的路徑前有一個$字符,這會將 ocx 的二進(jìn)制數(shù)據(jù)編譯到代碼里,發(fā)布后就不需要再帶一個 ocx 了,VB的 ocx 并不支持內(nèi)存加載,所以我們用 com.lite.appData() 函數(shù)將其自動復(fù)制到 %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個參數(shù)里指定 COM控件的 CLSID,但 VB 這個 CLSID 不好找,很多人是先注冊控件再去注冊表里查,問題是 VB6現(xiàn)在注冊控件會報錯失敗 —— 不過好在 aardio 可以免注冊調(diào)用 VB 控件,并且在 aardio 中可以省略 CLSID,aardio 會自己幫你找到正確的 CLSID 。這么貼心 —— 有沒有被感動呢?!
然后使用這個 comObject 就行了,不過能不能不寫這句代碼呢?!其實也是可以的,這就是我使用 dll.createEmbedEx() 而非 dll.createEmbed() 的原因了,這兩個函數(shù)作用相同,但帶 Ex 后綴的 dll.createEmbedEx() 多了一個功能,他返回的控件容器對象已經(jīng)自動實現(xiàn)了一個簡單的 COM 控件代理 —— 例如上面訪問 vbUserControl 對象的成員就會自動轉(zhuǎn)為調(diào)用 vbUserControl._object 的成員,等于將COM控件容器與 COM對象合二為一了。 //控件容器也是默認(rèn)的 COM 事件監(jiān)聽器,如下直接指定響應(yīng) COM 事件的函數(shù) vbUserControl.OnImageClick = function(value){ winform.edit.print('VB控件里點擊了圖像,事件參數(shù):'+value) //VB里這個事件的參數(shù)聲明為 ByRef,所以添加返回值可以修改參數(shù) return 100 } 是否還記得 VB6 里這個事件的參數(shù)指定為 ByRef 傳址,也就是說參數(shù) value 是一個引用參數(shù),在 aardio 中可以修改他的值,aardio 基于純函數(shù)原則不會直接修改外部參數(shù)的值,而是通過增加返回值修改引用參數(shù)的值。這個事件函數(shù)沒有返回值,也只有一個需要輸出值的引用參數(shù),所以增加一個返回值就可以了。
其實就是調(diào)用 com.pictrue.load() 加載圖像,再用 com.QueryObject() 轉(zhuǎn)換為 COM 對象( IDispatch 接口 ) ,然后就可以傳給 VB了: //修改VB控件的屬性 vbUserControl.Picture = com.picture.loadObject( '~\codes\范例程序\D) 圖形圖像\.gdip.jpg' ) 反正我在繁體系統(tǒng)下測試 VB控件直接加載上面的圖像會出問題,但用上面的方法 —— 用 aardio 加載圖像再傳給 VB6 就完美解決。
vbUserControl.TestProperty(2) = 123 千萬別以為是給函數(shù)的返回值賦值,我們把上面的參數(shù)化屬性賦值轉(zhuǎn)換為 等價的 aardio 代碼如下:
在 aardio 里給屬性加上 set 前綴就可以變成一個寫屬性的函數(shù),當(dāng)然也就支持多個參數(shù)了。同理,加上 get 前綴可以變成一個讀屬性函數(shù),如下: /* 帶多個參數(shù)的屬性加上get前綴并以函數(shù)形式調(diào)用,例如: */ var testProperty = vbUserControl.getTestProperty(2); 好吧下面我們看這個范例的完整 aardio 源碼,直接復(fù)制就可以運行,直接復(fù)制就是一個獨立的、完整的程序:
最后不得不佩服一下,這個 VB 控件的體積是:24KB,對比一下現(xiàn)在用 Electron 什么的沒寫幾個功能就幾百MB是什么概念,這幾百MB里有多少是你真正需要的東西?!不是說這些東西沒有用,就像豪華大房車一定是有用的,但你明明騎個自行車能解決的問題,非要每次都開豪華大房車嗎?!想想這個道理,就會明白 VB6 的好處在哪里。 |
|