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
插入到工具箱 , 再拖到對話框中
( 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 代碼:
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 代碼:
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 的派生類)。注意也要把打開按鈕一起移動.
代碼如下:
... {
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
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);
}