以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 代碼:
void CMPlayDlg::OnBnClickedLoad() ... {
CFileDialog dlg(TRUE, NULL, L"*.*", OFN_FILEMUSTEXIST,
"Active Streaming Format(*.asf)|*.asf|"
"Audio Video Interleave Format(*.avi)|*.avi|"
"RealAudio/RealVideo(*.rm)|*.rm|"
"Wave Audio(*.wav)|*.wav|"
"MIDI File(*.mid)|*.mid|"
"所有檔案(*.*)|*.*||");
if (dlg.DoModal() == IDOK) ...{
//m_ctrlMPlayer.put_stretchToFit(TRUE); // 伸縮畫面,使其适合播放視窗
// …… 可以在此進行各種其他設定
m_ctrlMPlayer.SetUrl(dlg.GetPathName()); // 傳遞媒體檔案到播放器
}
}
VC++ 2005 代碼:
void CMPlayDlg::OnBnClickedLoad() ... {
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()); // 傳遞媒體檔案到播放器
}
}
在該函數中設定了若幹流媒體檔案過慮器,建立打開檔案公用對話框對象,讓使用者選擇要播放的流媒體檔案,并将該檔案的路徑通過調用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(UINT nType, 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)
void CMPlayDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) ... {
if ((GetKeyState(VK_CONTROL) & 1<<15) &&
(nChar == 'L' || nChar == 'O' || nChar == 'F')) ...{
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); // 伸縮畫面,使其适合播放視窗
CString fn = L"MPlayer : " + dlg.GetFileName(); // 構造程式标題
SetWindowText(fn); // 設定程式視窗的标題
m_ctrlMPlayer.put_URL(dlg.GetPathName());
}
}
CDialog::OnKeyUp(nChar, nRepCnt, nFlags);
}
源檔案下載下傳: MPlay.rar(VC6.0)46KB MPlay.rar (for VC2005) 45KB
width="728" scrolling="no" height="90" frame align="middle" src="http://download1.csdn.net/down3/20070601/01184120111.htm" marginheight="0" marginwidth="0">