4.3 延伸後的廣告內容播放系統的設計與實作
4.3.2 各格式播放方案
4.3.2 (a) 各格式播放方案-Microsoft PowerPoint
微軟提供了一些 OLE 函式 (OLE 是一種由微軟所發展出來的混合式文件架 構,代表了物件的連結與嵌入,這是由兩種功能:「物件連結」(Object Link)以及
「物件嵌入」(Object Embedded)組成。) 可供程式開發者撰寫程式碼操控
PowerPoint 播放器。而 BCB6 也提供我們一組由許多 OLE 函式開發而成的 office2k 元件。在此我們選擇 office2k 元件來操控 PowerPoint 播放器,因為我們只有簡單 的開檔讀檔、播放以及換頁的需求。
當 PowerPoint 播放器被呼叫出來播放檔案之後,程式主控權會落在
PowerPoint 播放器上面,而我們的程式必需在播放完畢以後,取回程式主控權。
由於 PowerPoint 是一頁一頁的投影片連續放映方式,所以我們在讀檔的時候以
OLE 函數取得 PowerPoint 檔案的頁數,再加上一計數器,很容易就可得知 PowerPoint 是播放完畢。而在播映完畢後透過 office2k 元件,我們可以將程式主 控權要回,交還到流程控制器手上。以下是整個播放方案的流程圖:
ppt player
每隔設定的時間
圖三十一:Microsoft PowerPoint 播放方案流程圖
流程說明:
1. 由流程控制器提供一 PowerPoint 格式檔名 2. 由提供的檔名尋找指定檔案
3. 以函式獲得指定檔案的頁數 4. 讀檔
5. 取得使用者設定速度
6. 驅動播放程式播放(交出程式主控權)
7. 在背景執行週期換頁,並檢查檔案是否播放到最後一頁 8. 若為最後一頁則驅動播放程式關閉,取回程式主控權 9. 將主控權還由流程控制器處理。
4.3.2(b) 各格式播放方案-智勝國際講解手 3.1
透過 Windows API,我們的程式可以向作業系統發送請求,直接執行講解手 執行檔,而欲開啟的檔案可以以傳遞參數的方式達成。
每一份講解手檔案,都有一份專屬的發佈檔─publish.xml。透過解析此發佈 檔,我們可從其中的 node 取出時間資訊。有了播放時間,我們當我們呼叫 Windows API 去執行講解手播放器,把控制權交出後,可在背景以 timer 監控播放時間,
等到時間到即可呼叫作業系統關閉講解手播放器,解決主控權管理問題。
以下為播放流程圖:
GetAttribute();
欲播放bst檔的路徑 ShellExecute();
呼叫Windows API開啟 播放檔案 講解手播放程式,並載入
否 呼叫Windows API,找出講解手播放
程式的handle,並且發送系統訊息要求
為全螢幕模式。
欲播放bst檔的路徑 ShellExecute();
播放檔案 呼叫Windows API開啟
編輯手播放程式,並載入 檔案播放(交出程式主控權)
編輯手檔案 (*.bsa)
呼叫Windows API,找出編輯手播放 程式的handle,並且發送系統訊息要求
其流程如下:
4.3.2 (d) 各格式播放方案- Macromedia Flash
Flash 是一個很普遍通用的格式,所以能得到比較完整的支援。由於播放器 是採用 BCB 開發,所以使用 BCB 中內 ActiveX 分頁中,Flash 的控制元件
TShockwaveFlash 來實作。我們可以在 BCB 裡 Import ActiveX Control,安裝之中的 SWFlash.OCX 檔案即可使用。
表四為 Flash 常用的函式:
表四:Flash 常用函式
縮放 Zoom ()
設置縮放區域 SetZoomRect()
播放第一個Frame Rewind()
播放第下個Frame Forward()
播放上一個Frame SetZoomRect()
播放第一個Frame Rewind()
播放第下個Frame Forward()
播放上一個Frame
表五:Flash 常用屬性
縮放模式,0=ShowAll、1= NoBorder、2 = ExactFit;
ScaleMode
播放品質 0=Low, 1=High、2=AutoLow、3=AutoHigh;
Quality
播放狀態 0=Loading、1=Uninitialized、2=Loaded、3=Interactive 4=Complete ReadyState
縮放模式,0=ShowAll、1= NoBorder、2 = ExactFit;
ScaleMode
播放品質 0=Low, 1=High、2=AutoLow、3=AutoHigh;
Quality
播放狀態 0=Loading、1=Uninitialized、2=Loaded、3=Interactive 4=Complete ReadyState
說明 屬性
接下來介紹 TShockwaveFlash 的主要事件
1. OnProgress():讀取一個 flash 時觸發;
2. OnReadyStateChange(state):狀態改變時觸發。這個觸發事件可以搭配 ReadyState 屬性使用。(播放狀態 0=Loading、1=Uninitialized、2=Loaded、
3=Interactive 4=Complete)
Flash 動畫本身並無記錄時間資訊,不過可由取得所有 Frame 數以及現在播 放的 Frame 可得知有無播放完畢。或是以 IsPlaying()函式偵測是否播放完畢,所 以我們很容易以以上的資訊提供 Flash 播放方案,也無主控權移交問題。
void __fastcall TForm1::Panel1Resize(TObject *Sender){
…
this->ShockwaveFlash->Hide();//將播放畫面隱藏 this->ShockwaveFlash->Show(); //重新顯示 this->ShockwaveFlash->SetFocus();//設置焦點
… }