• 沒有找到結果。

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();//設置焦點

… }