摘要:在Authorware 7.0中利用ActiveX控件和外部函數能夠實現個性化媒體播放器的視頻播放控制部分的設計,對于彈出式菜單設計、按鈕激活條件的設置以及滑塊控制進度和音量等都比較容易。
關鍵詞:ActiveX;外部函數;菜單;按鈕;滑塊;播放器
中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2008)11-20329-03
1 前言
Authorware作為一種主要面向非程序員的優秀的交互式多媒體創作工具,為了滿足一些高級設計人員進行復雜程序創作的需要,Authorware從4.0版本開始提供了對ActiveX控件和外部函數的支持,由于有許多軟件廠商支持ActiveX技術,所以大多數功能都能找到相應的ActiveX控件。在Authorware中,通過調用ActiveX控件來直接使用現成的程序模塊,可省掉許多繁瑣的編程,而且幾乎可以完成任何工作。
目前,媒體播放器越來越追求個性化,為了滿足個性化的需求,我們可以借助圖形圖像處理軟件使播放界面個性化,在Authorware 7.0中利用控件以及外部函數能設計出播放各種媒體的個性化播放器。在設計視頻播放控制時,要注意播放、暫停、繼續、停止、快進、后退等操作的激活條件,進度滑塊及音量滑塊能及時地響應交互。在Authorware 7.0中設計的媒體播放器運行界面如圖1所示。
2 ActiveX控件的應用
ActiveX控件通常以動態鏈接庫的形式存在,其設計思想是將一個程序嵌入到另一個程序中,這樣就可使它能夠隨意地應用到各種場合。ActiveX控件的數據輸入和函數功能執行都必須通過容器,因此ActiveX控件和容器之間必須有一些特定的接口協議。ActiveX控件必須具備屬性(property)、方法(method)和事件(event),通過屬性的名稱、方法的名稱及參數,容器可以存取和改變ActiveX控件的屬性參數。通過事件,比如屬性參數的改變、用戶按下鼠標左鍵等,ActiveX控件通知容器進行響應相關操作。
2.1 ActiveX控件的安裝
在開發Authorware的應用程序時,如果利用了ActiveX控件,在打包發布時要注意兩點:(1)在用戶的應用程序中需附帶上所需的支持文件,即在應用程序的“Xtras”目錄里附帶上Activex.x32,因為只有這樣應用程序才能夠正常地執行,否則程序中的ActiveX控件是無法使用的。但是需要注意的是打包程序無須附帶上Actxpriv.x32,否則會造成不可預料的后果,因為它主要負責設計時利用ActiveX控件的界面。(2)要將所需的ActiveX控件相關文件(*.OCX或*.DLL)復制到硬盤相應的文件夾中(Windows NT以后的操作系統是%systemroot%\\system32),本播放器應用程序在設計時需要復制MSDXM.OCX、COMDLG32.OCX、FM20.DLL、FM20CHS.DLL四個文件,然后將其在Windows系統中注冊。
2.2 ActiveX控件的注冊
設計Authorware應用程序時,如果要使用Authorware沒有提供的控件,使用前要先在Windows中進行手動注冊。如果我們的程序中使用了控件且要交給用戶使用,在程序中應先檢測用戶機中是否注冊了該控件,若沒有就要進行自動安裝、自動注冊。本播放器使用時需要檢測Microsoft Forms 2.0 ScrollBar、Microsoft Common Dialog Control和Windows Media Player三個控件,以便確定是否要安裝、注冊。
注冊的方法有兩種:
(1)手動注冊
方法:先將所需的ActiveX控件相關文件(如MSDXM.OCX、COMDLG32.OCX、FM20.DLL、FM20CHS.DLL)復制到硬盤相應的文件夾中(Windows NT以后的操作系統是%systemroot%\\system32)。然后手動注冊,即單擊Windows的“開始”菜單,選擇“運行”命令,在打開的對話框中輸入以下命令: regsvr32.exe
regsvr32.exe是Windows自帶的ActiveX注冊工具,可以在Windows的系統目錄中找到。
(2)自動注冊
方法:利用Authorware 中的Xtra ActiveX 里的函數來進行注冊。對ActiveX控件注冊的格式如下: ActiveXControlRegister(\"
本播放器應用程序使用了三個控件,圖2是媒體播放器設計窗口。
圖標FileDialog負責打開文件,用的是Microsoft Common Dialog Control控件;圖標VolumeBar負責音量調節,圖標PositionBar負責進度處理,兩者用的是同一種控件Microsoft Forms 2.0 ScrollBar;圖標MediaPlay負責媒體播放,用的是Windows Media Player控件。在計算圖標Register中設置程序進行自動檢測、安裝和注冊,程序如下:
——獲取三個控件的classID
classIDScrollBar:=\"{DFD181E0-5E2F-11CE-A449-00AA004A803D}\"
classIDDialog:=\"{F9043C85-F6F2-101A-A3C9-08002B2F49FB}\"
classIDMediaplay:=\"{22D6F312-B0F6-11D0-94AB-0080C74C7E95}\"
——獲取系統文件夾
WindowsPath:=getosdirectory()
——判斷當前系統是否支持控件注冊
if ActiveXInstalled()=-1 then
——判斷Microsoft Forms 2.0 ScrollBar滾動條控件是否已安裝
if ActiveXControlQuery(classIDScrollBar)=0 then
——拷貝FM20.DLL和FM20CHS.DLL兩個文件到系統目錄
CopyFile(FileLocation^\"FM20.DLL\",WindowsPath^\"\\\\system32\\\\FM20.DLL\")
CopyFile(FileLocation^\"FM20CHS.DLL\",WindowsPath^\"\\\\system32\\\\FM20CHS.DLL\")
——注冊Microsoft Forms 2.0 ScrollBar滾動條控件
ActiveXControlRegister(WindowsPath^\"\\\\system32\\\\FM20.DLL\")
end if
——判斷、注冊Microsoft Common Dialog Control,version 6.0通用對話框控件
if ActiveXControlQuery(classIDDialog)=0 then
CopyFile(FileLocation^\"COMDLG32.OCX\",WindowsPath^\"\\\\system32\\\\COMDLG32.OCX\")
ActiveXControlRegister(WindowsPath^\"\\\\system32\\\\COMDLG32.OCX\")
end if
——判斷、注冊Windows Media Player 6.4控件
if ActiveXControlQuery(classIDMediaplay)=0 then
CopyFile(FileLocation^\"MSDXM.OCX\",WindowsPath^\"\\\\system32\\\\MSDXM.OCX\")
ActiveXControlRegister(WindowsPath^\"\\\\system32\\\\MSDXM.OCX\")
end if
end if
3 彈出式菜單
現在許多播放器都有彈出式菜單功能,如在圖1中的MENU按鈕上單擊時會出現有“打開文件”、“全屏播放”和“退出”三個子菜單項的菜單,且單擊某個子菜單項時執行相應操作。其設計原理是創建菜單、激活菜單、響應子菜單項。
3.1 創建菜單
計算圖標BuildMenu中的程序負責創建菜單,mCreatePopupMenu()、mAppendMenu( Menu, Flags , MenuID , MenuText )、mMenuHookOn( WindowHandle )函數都置于外部函數budmenu.u32中,使用時需載入到Authorware中,程序如下:
——選擇的菜單項的ID的初值
LastMenuID := -1
——添加一個filename主菜單項
filemenu := mCreatePopupMenu()
mAppendMenu( filemenu , 0 , 10 , \"打開文件\")
mAppendMenu( filemenu , 0 , 11, \"全屏播放\")
mAppendMenu(filemenu,2048,0,\"\")
mAppendMenu( filemenu , 0 , 12 , \"退出\")
——設置與Authorware通信的消息鉤子
mMenuHookOn( WindowHandle )
3.2 激活菜單
為了確保交互靈活,按鈕響應MenuActivation的響應需設為永久、返回,該響應包含的兩個計算圖標FileMenuTrack和ReturnLastMenuID的順序不可顛倒。
(1)計算圖標FileMenuTrack的程序為:
——激活菜單
mTrackPopupMenu(filemenu,0,ResponseLeft@“MenuActivation”+WindowLeft,ResponseTop@“MenuActivation”+ResponseHeight@“MenuActivation”+WindowTop,0,WindowHandle,0 )
(2)計算圖標ReturnLastMenuID的程序為:
——獲取最后選擇的菜單項的ID
LastMenuID := mGetLastMenuID()
Checked@\"MenuActivation\" := FALSE
3.3 響應子菜單項
根據獲取的最后選擇的子菜單項的ID 值來執行相應的響應為永久、返回的條件響應:LastMenuID=10 、LastMenuID=11和LastMenuID=12,從而實現文件打開、全屏播放和退出。
(1)計算圖標LastMenuID=10的程序為:
——打開文件
SetSpriteProperty(@\"FileDialog\", #dialogtitle, \"請選擇一個視頻文件:\")
SetSpriteProperty(@\"FileDialog\", #BaseURL, FileLocation)
SetSpriteProperty(@\"FileDialog\", #filter, \"視頻文件|*.mpg;*.avi;*.mpeg;*.dat;*.asf\")
CallSprite(@\"FileDialog\", #showopen)
getFile:=GetSpriteProperty(@\"FileDialog\", #FileName)
SetSpriteProperty(@\"MediaPlay\", #FileName,getFile)
SetSpriteProperty(@\"MediaPlay\",#displaysize,4)
CallSprite(@\"MediaPlay\",#play)
LastMenuID:=-1
(2)計算圖標LastMenuID=11的程序為:
——設置為全屏播放
SetSpriteProperty(@\"MediaPlay\",#displaysize,3)
LastMenuID:=-1
3)計算圖標LastMenuID=12的程序為:
——退出
mMenuHookOff()
mDestroyMenu(filemenu)
Quit()
4 按鈕控制
4.1 按鈕激活條件
在設計按鈕控制時,要合理設置播放(從頭開始)、暫停、繼續、停止(回到開頭)、快進、后退等按鈕的激活條件,文件沒打開所有按鈕應不可用,播放時繼續按鈕應處于隱藏狀態,暫停時停止按鈕不可用但繼續按鈕激活,停止時暫停按鈕不可用且繼續按鈕隱藏,視頻正常播放結束時暫停、停止、快進不可用且繼續隱藏。
4.2 程序設置
為了實現上述要求,在設計時每一個按鈕交互都要從兩方面考慮:激活條件和程序內容。
play:激活條件為playfile<>\"\",計算圖標內容為:
SetSpriteProperty(@\"MediaPlay\", #CurrentPosition,1)
CallSprite(@\"MediaPlay\", #Play)
pause:激活條件為(playstate=2)(CurrentPosition CallSprite(@\"MediaPlay\", #Pause) resume:激活條件為(playstate=1)(CurrentPosition CallSprite(@\"MediaPlay\", #Play) stop:激活條件為(playstate=2)(CurrentPosition SetSpriteProperty(@\"MediaPlay\", #CurrentPosition,1) CallSprite(@\"MediaPlay\", #stop) fastforward:激活條件為CurrentPosition Duration:=GetSpriteProperty(@\"MediaPlay\", #Duration) CurrentPosition:=GetSpriteProperty(@\"MediaPlay\", #CurrentPosition) if CurrentPosition NewPosition:=CurrentPosition+15 else NewPosition:=Duration end if SetSpriteProperty(@\"MediaPlay\", #CurrentPosition,NewPosition) CallSprite(@\"MediaPlay\", #play) fastreverse:激活條件為CurrentPosition>1,計算圖標內容為: Duration:=GetSpriteProperty(@\"MediaPlay\", #Duration) CurrentPosition:=GetSpriteProperty(@\"MediaPlay\", #CurrentPosition) if CurrentPosition>15 then NewPosition:=CurrentPosition-15 else NewPosition:=0 end if SetSpriteProperty(@\"MediaPlay\", #CurrentPosition,NewPosition) CallSprite(@\"MediaPlay\", #Play) 5 滑塊控制進度及音量 5.1 滑塊作用 拖動水平滑塊,調整文件播放進度,且滑塊在水平滾動條上的位置與文件當前進度的百分比一致。拖動垂直滑塊,調整音量大小,且滑塊在垂直滾動條上的位置與系統音量大小的百分比一致。 5.2 事件響應設置 在兩個事件響應BarSetMaster和BarSetPosition中,響應都設為永久、返回,事件響應BarSetMaster的事件設為發送“圖標VolumeBar”的事件“Change”, 事件響應BarSetPosition的事件設為發送“圖標PositionBar”的事件“Change”。 (1)計算圖標BarSetMaster內容為: volume:=GetSpriteProperty(@\"VolumeBar\",#value) baSetVolume(\"master\",100-volume) (2)計算圖標BarSetPosition內容為: position:=GetSpriteProperty(@\"PositionBar\",#value) Duration:=GetSpriteProperty(@\"MediaPlay\", #Duration) CurrentPosition:=position/100*Duration SetSpriteProperty(@\"MediaPlay\", #CurrentPosition,CurrentPosition) CallSprite(@\"MediaPlay\", #Play) PauseFlag:=1 6 結束語 在Authorware中如果能夠合理地運用ActiveX控件和外部函數,個性化媒體播放器可以設計的非常完善,各種功能都能實現,即使是滑塊動態地顯示當前進度、播放狀態等也能較好地解決。 參考文獻: [1] 畢廣吉.Authorware多媒體開發程序設計與典型實例[M].北京:人民郵電出版社,2004. [2] 陳學韶.Authorware7多媒體設計師特訓班[M].四川:四川電子音像出版中心,2004. 注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文