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