前幾天突然間心血來潮,打算自己用VC做一個媒體播放器,於是到網上搜尋了一下,發現有很多好心人貼出了很多例子(很是感謝),一些是VC6寫的,一些是VC2003/2005寫的,都是直接通過wmp.dll(WINDOW MEDIA PLAYER9帶的ACTIVE控制項,存放在C:\WINDOWS\system32目錄下。本人對VC6有點排斥(哈哈,就是覺得其C++標準支援太差了,故一般做項目時不考慮,實在沒辦法的時候才採用),就直接開始在VC2005下按照提示編寫了。
開始總是一樣:
1、添加一個解決方案;
2、在解決方案下添加一個MFC對話方塊程式;
3、編輯對話方塊資源的時候,在左邊的工具列上通過選擇項-》COM組件,選擇Windows Media Player進行添加,添加之後工具列上即多了一個Windows Media Player項,把其拉到設計視窗中,選擇其屬性,設定enableContextMenu為true,即允許播放器快顯功能表;
4、給對話方塊添加菜單,菜單功能很簡單,就是檔案-》開啟/退出;
在資源視窗中通過右鍵選擇添加一個MENU,預設為IDR_MENU1,然後在對話方塊的屬性中把Menu設定為IDR_MENU1,此時即在對話方塊中加入了菜單:
5、實現子功能表項的開啟功能:
在資源視窗的開啟子功能表中,點擊右鍵,選擇添加事件處理,訊息選擇COMMAND,類列表選擇Dlg的那個,此時即可編輯函數:
void CMPlayDlg::On32771()
{
CFileDialog dlg(TRUE, NULL, L"*.*", OFN_FILEMUSTEXIST,
L"Active Streaming Format(*.asf)|*.asf|"\
L"Audio Video Interleave Format(*.avi)|*.avi|"\
L"RealAudio/RealVideo(*.rm)|*.rm|"\
L"Wave Audio(*.wav)|*.wav|"\
L"MIDI File(*.mid)|*.mid|"\
L"所有檔案(*.*)|*.*||");
if (dlg.DoModal() == IDOK) {
//m_ctrlMPlayer.put_stretchToFit(TRUE); // 伸縮畫面,使其適合播放視窗
// …… 可以在此進行各種其他設定
m_ctrlMPlayer.put_URL(dlg.GetPathName()); // 傳遞媒體檔案到播放器
}
}
6、實現視窗的WMSIZE:
由於視窗大小會產生改變,所以視窗中的視頻視窗也要作相應的變動,故需要實現視窗的WM_SIZE函數:
void CMPlayDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (m_ctrlMPlayer)
{
m_ctrlMPlayer.MoveWindow(0, 0, cx-40, cy);
}
}
註:沒加上 if (m_ctrlMPlayer)之前DEBUG總是報錯,RELEASE倒是沒事,後來我想應該是程式啟動時,m_ctrlMPlayer還沒有初始化,故報錯。
這樣一個簡單的播放器就做成了。
由於我想要查看一下當前播放的媒體的名稱以及想查看進度,故需要引進CWMPMedia和CWMPControls一類的控制對象,所以在解決方案的資源管理員中右鍵-》添加類-》MFC-》ACTIVEX中的MFC類-》下拉式清單中選擇Windows Media Player<1.0>,然後選擇左邊的一些相關類拉到右邊來,確定即可,此時這些類對應的H和CPP檔案就都加了進來;
我想控制播放器的播放,參考了網上的一些代碼,所以:
m_control = m_ctrlMPlayer.get_controls();
double d = m_control.get_currentPosition();
d = d+1;
CWMPMedia m_media = static_cast<CWMPMedia>(m_ctrlMPlayer.get_currentMedia());
CString s = m_media.get_name();
哈哈,總是編譯不通過,後來查了一下,發現CWMPControls是繼承自CWnd,所以從網上抄了CWMPControls繼承自COleDispatchDriver的H和CPP的代碼。編譯通過(為了尋找這個問題,花了不少時間)。
哈哈,借花獻佛,希望有碰到同樣的問題的朋友少走點彎路。