程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 制作VC++應用程序的多媒體封面

制作VC++應用程序的多媒體封面

編輯:vc教程

當我們使用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窗口。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved