本帖最后由 阿達 于 2010-3-17 15:20 編輯
用flash做界面很漂亮,但是用戶系統很可能沒有flash,我目前用以下方法處理:
用
- IsObject(CreateObject("shockwaveflash.shockwaveflash"))
復制代碼
判斷用戶系統是否有flash
如果有
- Public WithEvents shockwaveFlash As VBControlExtender
- Set Frm_Main.shockwaveFlash = Frm_Main.Controls.Add("ShockwaveFlash.ShockwaveFlash", "Flash")
- Frm_Main.shockwaveFlash.object.LoadMovie 0, App.Path & "ui.swf"
復制代碼
這樣來動態創建flash控件,好處是這樣程序在用戶系統沒有flash的情況下也可以正常運行,不會報錯。
如果用戶系統沒有,就用個容器,里面放些死的圖片,實現同樣的功能。
通信方面,flash調用vb的:
- Private Sub shockwaveFlash_ObjectEvent(info As EventInfo)
- Select Case info.Name
- Case "FSCommand"
- 'info.EventParameters("command").Value
- 'info.EventParameters("args").Value
- '上面兩句可以拿到fscommand的兩個參數
- Case Else '其他事件
- End Select
- End Sub
復制代碼
flash中 fscommand(xxx, xxx); 就可以啦
vb調用flash的:
- //flash中增加、聲明一個回調函數供vb調用
- ExternalInterface.addCallback("vbCallBack", vbCallBack);
- function vbCallBack(valA:String, valB:String):void
- {
- //
- }
- 'vb中這樣搞
- shockwaveFlash.object.CallFunction "<invoke name=""vbCallBack"" returntype=""xml""><arguments><string>參數a</string><string>參數b</string></arguments></invoke>"
復制代碼
這樣就好啦,就是來回都只能用string類型,如果是圖片,得先base64成字符串,然后傳來解析。
另外如果一個程序中同時有幾個flash之間要通信,可以用flash的管道,不需要通過程序轉。
再付上一個屏蔽flash右鍵的
- Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
- Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
- Public Const GWL_WNDPROC = -4
- Private Const WM_RBUTTONDOWN = &H204
- Public ret As Long
- Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- If Msg = WM_RBUTTONDOWN Then Exit Function '這里可以還增加自己的代碼用于響應flash中的右鍵行為
- WindowProc = CallWindowProc(ret, hwnd, Msg, wParam, lParam)
- End Function
- '由于vb中flash控件沒有hwnd,記得delphi中是有的,當時讓我很郁悶,調用得如下:
- ret = SetWindowLong(FindWindowEx(Picture1.hwnd, 0&, "MacromediaFlashPlayerActiveX", vbNullString), GWL_WNDPROC, AddressOf WindowProc)
復制代碼
收工~~~~ |