在VC++2005中使用Windows Media Play ActiveX控件

VC++2005有許多東西變了,比如ActiveX控件的添加和控制——僅僅爲了添加一個Windows Media Player控件,我就弄得頭暈轉向,按老辦法做行不通不說,自己摸索了半天+上網搜索+去書店翻書都沒有徹底。幸虧找到了這篇文章,才得以解決。感謝touzani大俠(http://blog.csdn.net/touzani/ )!

原文如下:

 

以ActiveX 控件——媒體播放器爲例,說明組件應用之功能強大和使用的簡單方便。

 

媒體播放器 (Media Player) DirectX Media 中的一個 ActiveX 控件,支持大多數標準流媒體格式的播放,如 ASF AVI MPEG WAV MIDI MP3 WMA 等,但對 RM MOV 支持得不夠。

 

創建一個基於對話框的 MFC 應用程序 MPlay

爲了能夠在項目中使用媒體播放器控件,必須先將媒體播放器控件添加到對話框編輯器工具箱中。(這需要在你的系統中,已經正確安裝了微軟公司的媒體播放器)

 

1. 添加 ActiveX 控件

(VC++ 6.0)

工程-添加到工程- > components and controls 選擇 Windows Media Player

https://p-blog.csdn.net/images/p_blog_csdn_net/touzani/303255/o_mplay.jpg

 

插入到工具箱 , 再拖到對話框中

( VC++2005方法)

1 打開工具箱窗口,在其空白區單擊鼠標右鍵,在彈出菜單中選中“選擇項”菜單項;也可以選 VS 的“工具 \ 選擇工具箱項”菜單項;在彈出的“選擇工具箱項”對話框中,選擇“ COM 組件”頁;滾動到列表框的底部,選中“ Windows Media Player ”項,按“確定”鈕,關閉對話框。系統會將一個“ Windows Media Player ”控件,加入到工具箱的對話框編輯器欄的底部。這樣你就可以將其加入到對話框資源中了。

 

2 你也可以簡單地在對話框資源中單擊鼠標右鍵,在彈出菜單中選中“插入 ActiveX 控件”菜單項;在打開的“插入 ActiveX 控件”對話框中,滾動列表框,選擇底部的“ Windows Media Player ”項,按“確定”鈕,關閉對話框。則系統會將其自動加入到對話框資源中(但這樣是不會在工具箱中添加對應控件的)。

)

2 )設計對話框

 

在對話框中調整好媒體播放器控件的位置和大小,打開屬性窗口,設置其 ID IDC_MP 。去掉對話框中 “取消”鈕,將“確定”鈕中的文字改爲“打開 (&O) ”,並修改其 ID IDC_LOAD (用來打開文件對話框,選擇播放的流媒體文件,並將該文件的路徑名傳遞給媒體播放器),而播放、暫停、停止等圖形按鈕控件中已經有了。
在你爲對話框加入媒體播放器控件後,
MFC 會自動在資源文件 MPlay.rc 中添加對它的複雜初始化代碼.

還可以按屬性窗口工具條上的屬性頁按鈕,在彈出的“ Windows Media Player 屬性”對話框中,進行各種屬性設置,例如選中“按比例伸展”和“全屏播放”複選框。

 

3 )添加控件變量

爲了能使用媒體播放器控件,我們必須爲該控件添加一個控件型類變量 m_ctrlMPlayer;

同時給打開按鈕添加了變量 m_ctrlLoad.

 

4 )使用控件

這裏所要做的工作,只是在 CMPlayDlg 類中,爲“裝入”按鈕添加單擊事件 BN_CLICKED 的處理程序 OnBnClickedLoad ,並在該函數中打開公用文件對話框,獲取用戶選擇的媒體文件名,並將該文件的路徑傳遞給媒體播放器類對象:

 

VC++ 6.0 代碼:

void CMPlayDlg::OnBnClickedLoad() ... {

CFileDialogdlg(TRUE,NULL,L
" *.* " ,OFN_FILEMUSTEXIST,

" ActiveStreamingFormat(*.asf)|*.asf| "

" AudioVideoInterleaveFormat(*.avi)|*.avi| "

" RealAudio/RealVideo(*.rm)|*.rm| "

" WaveAudio(*.wav)|*.wav| "

" MIDIFile(*.mid)|*.mid| "

" 所有文件(*.*)|*.*|| " );

if (dlg.DoModal() == IDOK) ... {

// m_ctrlMPlayer.put_stretchToFit(TRUE); // 伸縮畫面,使其適合播放窗口

// ……可以在此進行各種其他設置

m_ctrlMPlayer.SetUrl(dlg.GetPathName());
// 傳遞媒體文件到播放器



}


}


VC++ 2005 代碼:

void CMPlayDlg::OnBnClickedLoad() ... {

CFileDialogdlg(TRUE,NULL,L"*.*",OFN_FILEMUSTEXIST,

L"ActiveStreamingFormat(*.asf)|*.asf|"

L"AudioVideoInterleaveFormat(*.avi)|*.avi|"

L"RealAudio/RealVideo(*.rm)|*.rm|"

L"WaveAudio(*.wav)|*.wav|"

L"MIDIFile(*.mid)|*.mid|"

L"所有文件(*.*)|*.*||"
);

if (dlg.DoModal()==IDOK) ... {

// m_ctrlMPlayer.put_stretchToFit(TRUE); // 伸縮畫面,使其適合播放窗口

// ……可以在此進行各種其他設置

m_ctrlMPlayer.put_URL(dlg.GetPathName());
// 傳遞媒體文件到播放器

}


}

 

在該函數中設置了若干流媒體文件過慮器,創建打開文件公用對話框對象,讓用戶選擇要播放的流媒體文件,並將該文件的路徑通過調用 CMp 類的成員函數 Set_URL 傳遞給媒體播放器。

 

注意 ,媒體播放器控件有各種不同的版本,對應的函數名也可能有所不同。如果找不到類似功能的函數,說明你係統中安裝的媒體播放器控件有問題,可以點擊這裏 下栽 mp.h 頭文件,用它替代你的同名文件。

現在程序可以編譯運行了...

 

5 )改變播放器窗口大小

要使程序可以讓用戶任意改變播放器窗口的大小,則需要設置對話框(位於屬性窗口頂部的外觀欄中)的邊框屬性 border Resizing (可調整大小),該屬性的缺省值爲 Dialog Frame (對話框邊框),是不能調整大小的。還可以同時設置 Maximize Box Minimize Box 屬性爲 True

爲了使媒體播放器的窗口隨對話框而改變大小,需要爲項目的對話框類添加 WM_SIZE 的消息響應函數 OnSize 。並在該函數中,調用 CWnd 的成員函數

void MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE);

來改變播放器窗口的大小(注意:媒體播放器類是 CWnd 的派生類)。注意也要把打開按鈕一起移動.

代碼如下:

void CMplayDlg::OnSize(UINTnType, int cx, int cy)

... {

CDialog::OnSize(nType,cx,cy);

m_ctrlMPlayer.MoveWindow(
0 , 0 ,cx - 40 ,cy);

m_ctrlLoad.MoveWindow(cx
- 40 , 0 ,cx,cy); // 改變打開按鈕位置

}

還可以爲對話框類再添加 WM_KEYUP 消息響應函數。在該函數中,響應用戶按鍵 Ctrl+L|O|F ,打開公用文件對話框,讓用戶選擇媒體文件,並將其傳送給播放器對象(後面這部分代碼與前面的一樣)。

代碼如下:(VC++ 2005)

 

 

源文件下載: MPlay.rar(VC6.0)46KB MPlay.rar (for VC2005) 45KB

 

void CMPlayDlg::OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags)... {

if ((GetKeyState(VK_CONTROL)&1<<15)&&

(nChar=='L'||nChar=='O'||nChar=='F'))... {

CFileDialogdlg(TRUE,NULL,L"*.*",OFN_FILEMUSTEXIST,

L"ActiveStreamingFormat(*.asf)|*.asf|"

L"AudioVideoInterleaveFormat(*.avi)|*.avi|"

L"RealAudio/RealVideo(*.rm)|*.rm|"

L"WaveAudio(*.wav)|*.wav|"

L"MIDIFile(*.mid)|*.mid|"

L"所有文件(*.*)|*.*||");

if (dlg.DoModal()==IDOK)... {

m_ctrlMPlayer.put_stretchToFit(TRUE);//伸縮畫面,使其適合播放窗口

CStringfn=L"MPlayer:"+dlg.GetFileName();//構造程序標題

SetWindowText(fn);//設置程序窗口的標題

m_ctrlMPlayer.put_URL(dlg.GetPathName());

}


}


CDialog::OnKeyUp(nChar,nRepCnt,nFlags);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章