?? 制作vc++應用程序的多媒體封面.txt
字號:
作者:SKYHORSEBJ
email: XUEY@CIDC.COM.CN
日期:2001-7-4 17:29:48
當我們使用Visual C++(以下簡稱VC)開發(fā)的應用程序時,若能為應用程序制作一個生動的多媒體封面(如播放一段AVI影視)一定能使應用程序增色不少。有兩種方法可以實現(xiàn)這個功能,一種方法是使用底層AVI文件函數(shù),從AVI視頻文件中讀取視頻流,盡管這種方法可以控制整個播放過程,但需要編寫大量代碼;另一種更簡便的實現(xiàn)方法是使用現(xiàn)有的Video for W indows SDK的窗口類MCIWnd(媒體控制界面窗口),這種方法比較易于操作,現(xiàn)介紹如下。
設計思想及關鍵技術
MCIWnd是一個控制多媒體設備(如MIDI、數(shù)字視頻、VCR以及CD音頻設備等)的窗口類,要制作多媒體封面只需創(chuàng)建該類的一個窗口,然后向它發(fā)送打開和控制MCI設置的消息。為實現(xiàn)封面效果,我們應當在Initial Instance()函數(shù)執(zhí)行初始化任務之前,對AVI文件進行播放,主要使用Video for Windows SDK的以下幾個函數(shù):
1.MCIWndRegisterClass()注冊MCIWnd窗口類。
2.MCIWndCreate()
·函數(shù)原型
HWND MCIWndCreate(HWND hwndParent,HINSTANCE hInstance, DWORD dwStyle,LPSTRs zFile);
·實現(xiàn)功能
該函數(shù)創(chuàng)建一個使用MCI設備的窗口,返回MCI設備窗口的句柄。
·參數(shù)說明
hwndParent:父窗口句柄,在本應用中父窗口應為NULL;
hInstance: 當前實例句柄,可以用AfxGet InstanceHandle()函數(shù)獲得;
dwStyle: MCIWnd窗口的風格;
szFile: 打開的MCI設備的名稱,在此處設為NULL。
3.MCIWndOpenO
·函數(shù)原型
LONG MCIWndOpen(HWND hwnd,LPVOID szFile,UINT wFlags)
·實現(xiàn)功能
向MCIWnd窗口發(fā)送MCIWNDM_OPEN消息,打開某MCI設備,將其關聯(lián)到
一個MCIWnd窗口。若調用成功則返回值為0。
·參數(shù)說明
hwnd:MCI窗口句柄;
szFile:MCI文件名;
wFlags:設備打開方式標識。
4.MCIWndPlay()
·函數(shù)原型
LONG MCIWndPlay(HWND hwnd)
·實現(xiàn)功能
發(fā)送MCI_PLAY消息,MCIWnd窗口接收到該消息,播放已經(jīng)打開的MCI文件。
·參數(shù)說明
hwnd:MCI窗口句柄;
5.MCIWndUseTime()
該函數(shù)將MCI設備的時間格式設置為毫秒;設置其它時間格式可以用函數(shù)MCIWndSetTime Format()實現(xiàn)。
6.MCIWndGetLength()
該函數(shù)向MCIWnd窗口發(fā)送MCIWNDM_GETLENGTH消息,根據(jù)MCI設備所使用的
時間格式返回文件的長度。
7.MCIWndDestroy()
該函數(shù)向窗口發(fā)送一個WM_CLOSE消息,窗口接收到該消息之后,關閉所打
開的MCI文件,并關閉窗口。雖然SDK還提供了一個MCIWndClose函數(shù),但
該函數(shù)只能關閉在MCIWnd窗口中打開的文件,而MCIWnd窗口仍處于開啟
狀態(tài),仍可以打開其它MCI文件并進行播放。
實現(xiàn)步驟
假設我們已經(jīng)通過MFC AppWizard(EXE)建立了一個名為Example的工程,則該應用至少包含有CExampleApp、CMainFrame、CExampleView三個類。
下面我們給這個應用加入多媒體封面,具體實現(xiàn)步驟如下:
1.編輯Stdafx.h
在Stdafx.h中放入包含文件可以使用預編譯頭文件中的所有多媒體信息。由于項目中的每一個文件已經(jīng)包括了Stdafx.h,所以在其它地方不必包含
這些多媒體文件。在Stdafx.h中放入包含文件可以使用預編譯頭文件中的所有多媒體信息。由于項目中的每一個文件已經(jīng)包括了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窗口,然后開始應用程序的常規(guī)初始化。
BOOL CExampleApp::InitInstance()
{
if(!MCIWndRegisterClass()) //注冊MCIWnd窗口類
return FALSE;
HWNDm_hAVI //定義一個播放AVI文件的窗口句柄
m_hAVI=MCIWndCreate(NULL,AfxGetInstanceHandle(),
MCIWNDF_NOPLAYBAR|
WS_VISIBLE|
WS_POPUT,
NULL); //創(chuàng)建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窗口
}
//開始常規(guī)初始化
#ifdef_AFXDLL
Enable3dControls(); //Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); //Call this when linking to MFC statically
#endif
……
}
由于Windows系統(tǒng)是多任務、多進程并行的,因此要讓InitialInstance進程休眠,等待M CIWndPlay進程播放AVI文件結束后才能繼續(xù)執(zhí)行
InitialInstance進程,否則系統(tǒng)將在播放A VI影視的同時執(zhí)行應用程序的初始化,不能達到動畫封面效果。在以上代碼中,陰影部分的程序段的
功能就是獲得AVI文件播放時間長度PlayTime,然后使用::Sleep()函數(shù)讓進程休眠Pl ayTime毫秒后關閉MCIWnd窗口。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -