以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