當我們使用Visual C++(以下簡稱VC)開發的應用程序時,若能為應用程序制作一個生動的多媒體封面(如播放一段AVI影視)一定能使應用程序增色不少。有兩種方法可以實現這個功能,一種方法是使用底層AVI文件&&函數,從AVI視頻文件中讀取視頻流,盡管這種方法可以控制整個播放過程,但需要編寫大量代碼;另一種更簡便的實現方法是使用現有的Video for W indows SDK的窗口類MCIWnd(媒體控制界面窗口),這種方法比較易於操作,現介紹如下。
設計思想及關鍵技術
MCIWnd是一個控制多媒體設備(如MIDI、數字視頻、VCR以及CD音頻設備等)的窗口類,要制作多媒體封面只需創建該類的一個窗口,然後向它發送打開和控制MCI設置的消息。為實現封面效果,我們應當在Initial Instance()&&函數執行初始化任務之前,對AVI文件進行播放,主要使用Video for Windows SDK的以下幾個&&函數:
1.MCIWndRegisterClass()注冊MCIWnd窗口類。
2.MCIWndCreate()
·&&函數原型
HWND MCIWndCreate(HWND hwndParent,HINSTANCE hInstance, DWord dwStyle,LPSTRs zFile);
·實現功能
該&&函數創建一個使用MCI設備的窗口,返回MCI設備窗口的句柄。
·參數說明
hwndParent:父窗口句柄,在本應用中父窗口應為NULL;
hInstance: 當前實例句柄,可以用AfxGet InstanceHandle()&&函數獲得;
dwStyle: MCIWnd窗口的風格;
szFile: 打開的MCI設備的名稱,在此處設為NULL。
3.MCIWndOpenO
·&&函數原型
LONG MCIWndOpen(HWND hwnd,LPVOID szFile,UINT wFlags)
·實現功能
向MCIWnd窗口發送MCIWNDM_OPEN消息,打開某MCI設備,將其關聯到一個MCIWnd窗口。若調用成功則返回值為0。
·參數說明
hwnd:MCI窗口句柄;
szFile:MCI文件名;
wFlags:設備打開方式標識。
4.MCIWndPlay()
·&&函數原型
LONG MCIWndPlay(HWND hwnd)
·實現功能
發送MCI_PLAY消息,MCIWnd窗口接收到該消息,播放已經打開的MCI文件。
·參數說明
hwnd:MCI窗口句柄;
5.MCIWndUseTime()
該&&函數將MCI設備的時間格式設置為毫秒;設置其它時間格式可以用&&函數MCIWndSetTime Format()實現。
6.MCIWndGetLength()
該&&函數向MCIWnd窗口發送MCIWNDM_GETLENGTH消息,根據MCI設備所使用的時間格式返回文件的長度。
7.MCIWndDestroy()
該&&函數向窗口發送一個WM_CLOSE消息,窗口接收到該消息之後,關閉所打開的MCI文件,並關閉窗口。雖然SDK還提供了一個MCIWndClose&&函數,但該&&函數只能關閉在MCIWnd窗口中打開的文件,而MCIWnd窗口仍處於開啟狀態,仍可以打開其它MCI文件並進行播放。
實現步驟
假設我們已經通過MFC AppWizard(EXE)建立了一個名為Example的工程,則該應用至少包含有CExampleApp、CMainFrame、CExampleVIEw三個類。
下面我們給這個應用加入多媒體封面,具體實現步驟如下:
1.編輯Stdafx.h
在Stdafx.h中放入包含文件可以使用預編譯頭文件中的所有多媒體信息。由於項目中的每一個文件已經包括了Stdafx.h,所以在其它地方不必包含這些多媒體文件。在Stdafx.h中放入包含文件可以使用預編譯頭文件中的所有多媒體信息。由於項目中的每一個文件已經包括了Stdafx.h,所以在其它地方不必包含這些多媒體文件。
#include<afxwin.h> //MFC core and standard
components
#include<afxext.h> //MFC extensions
#include<vfw.h>
#pragma comment(lib,"vfw32.lib")
2.編輯CExampleApp::InitInstance()
注冊MCIWnd窗口類,打開MCIWnd窗口,並播放AVI文件,最後關閉MCIWnd窗口,然後開始應用程序的常規初始化。
BOOL CExampleApp::InitInstance()
{
if(!MCIWndRegisterClass()) //注冊MCIWnd窗口類
return FALSE;
HWNDm_hAVI //定義一個播放AVI文件的窗口句柄
m_hAVI=MCIWndCreate(NULL,AfxGetInstanceHandle(),
MCIWNDF_NOPLAYBAR|
WS_VISIBLE|
WS_POPUT,
NULL); //創建MCIWnd窗口
if(m_hAVI=NULL)
return FALSE;
constCString filename="d:\zhp\example.avi" //AVI文件名
if(filename.GetLength()>0)
{
MCIWndOpen(m_hAVI,(LPCSTR)filename,0); //打開設備文件
if(MCIWndUseTime(m_haAVI)!=0)
//設置MCI時間格式
return FALSE;
long PlayTime=MCIWndGetLength(m_hAVI);
//獲得AVI文件的播放時間長度
MCIWndPlay(m_hAVI); //播放AVI影視文件
::Sleep(PlayTime); //進程休眠
MCIWndDestroy(m_hAVI); //關閉MCI窗口
}
//開始常規初始化
#ifdef_AFXDLL
Enable3dControls(); //Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); //Call this when linking to MFC statically
#endif
……
}
由於Windows系統是多任務、多進程並行的,因此要讓InitialInstance進程休眠,等待M CIWndPlay進程播放AVI文件結束後才能繼續執行InitialInstance進程,否則系統將在播放A VI影視的同時執行應用程序的初始化,不能達到動畫封面效果。在以上代碼中,陰影部分的程序段的功能就是獲得AVI文件播放時間長度PlayTime,然後使用::Sleep()&&函數讓進程休眠Pl ayTime毫秒後關閉MCIWnd窗口。