自制多媒体播放器
使用VC++6.0强大的AppWizard、ClassWizard和其中的各种控件可以方便地建立各种应用程序。但是想要实现更高级更复杂的功能,就要借助丰富的ActiveX控件资源了。这里就要使用VC++6.0自带的一个ActiveX控件——ActiveMovieControl Object,来建立自己的多媒体播放器。此多媒体具有一般的播放功能,能播放:*.mp3,*.wma,*.mdi,*.wav,*.avi,*.dat等文件,还有Repeat功能。
具体步骤:
1. 打开VC6.0,在Projects下选择MFC AppWizard(exe),并取名MediaPlayer,然后建立基于对话框的应用程序。
2. 打开Resource View,选择其中的对话框,打开其中的主对话框,去掉对话框上的“确定”按钮,保留“取消”,将Caption改为“退出”。然后再在上面加上九个按钮,ID和Caption分别为
IDC_OPEN,打开;
IDC_PLAY,播放;
IDC_PAUSE,暂停;
IDC_STOP,停止;
IDC_CLOSE,关闭;
IDC_LOWER,<<=;
IDC_UPPER,=>>;
IDC_FULLSCREEN,全屏;
IDC_REPEAT,重复;
再加入两个静态文本控件,分别为:
IDC_STATIC,音量;
IDC_STATIC2,状态:正常。
3. 点击“开始”菜单,运行 regsvr32 msdxm.ocx,出现“注册成功”的对话框后打开Projects->Add to Project->Components and Controls->Registered ActiveX Controls对话框,选择其中的ActiveMovieControl Object, Insert,OK之后,会发现控件面板上多了一项ActiveMovieControl Object,将它选中,直接放在对话框上。
按Ctrl+W打开ClassWizard为它添加变量m_ActiveMovie。各控件的布局如图:
4.为程序添加消息处理函数。打开ClassWizard,为各个按钮加入消息处理函数。在MediaPlayerDlg.cpp文件里为各消息处理函数添加代码,各代码如下:
void CMediaPlayerDlg::OnClose()
{
m_ActiveMovie.CloseWindow();//关闭窗口
}
void CMediaPlayerDlg::OnOpen()
{
char szFileFilter[]=
"Mp3 File(*.mp3)|*.mp3|"
"Wma File(*.wma)|*.wma|"
"Video File(*.dat)|*.dat|"
"Wave File(*.wav)|*.wav|"
"AVI File(*.avi)|*.avi|"
"Movie File(*.mov)|*.mov|"
"Media File(*.mmm)|*.mmm|"
"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"
"MPEG File(*.mpeg)|*.mpeg|"
"All File(*.*)|*.*||";//文件类型过滤
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK){
CString PathName=dlg.GetPathName();
PathName.MakeUpper();
m_ActiveMovie.SetFileName(PathName);
}
}
void CMediaPlayerDlg::OnPlay()
{
m_ActiveMovie.Run();//播放文件
SetTimer(0,20,NULL);//设置定时器
}
void CMediaPlayerDlg::OnStop()
{
m_ActiveMovie.Stop();//停止播放文件
KillTimer(0);//关掉定时器
}
void CMediaPlayerDlg::OnPause()
{
m_ActiveMovie.Pause();//暂停播放
}
void CMediaPlayerDlg::OnUpper()//增加音量
{
long Volume=m_ActiveMovie.GetVolume();
m_ActiveMovie.Pause();
m_ActiveMovie.SetVolume(Volume+100);
m_ActiveMovie.Run();
}
void CMediaPlayerDlg::OnLower()//减少音量
{
long Volume=m_ActiveMovie.GetVolume();
m_ActiveMovie.Pause();
m_ActiveMovie.SetVolume(Volume-100);
m_ActiveMovie.Run();
}
void CMediaPlayerDlg::OnRepeat()//重复模式
{
if(!isRepeat){
isRepeat=TRUE;
SetDlgItemText(IDC_STATIC2,"状态:重复");
}
else{
isRepeat=FALSE;
SetDlgItemText(IDC_STATIC2,"状态:正常");
}
}
void CMediaPlayerDlg::OnFulscreeen()//全屏播放
{
m_ActiveMovie.Pause();
m_ActiveMovie.SetFullScreenMode(true);
m_ActiveMovie.SetMovieWindowSize(SW_SHOWMAXIMIZED);
m_ActiveMovie.Run();
}
这里需要注意的是,下面的函数OnTimer()需通过ClassWizard(Ctrl+W)来添加,不能直接复制:
void CMediaPlayerDlg::OnTimer(UINT nIDEvent)
{
double CurrentPos=m_ActiveMovie.GetCurrentPosition();
if(CurrentPos==0&&isRepeat)//如果当前是文件的起始位置而且为重复播放状态
m_ActiveMovie.Run();
CDialog::OnTimer(nIDEvent);
}
5. 为使播放器具有重复播放功能,需在头文件MediaPlayerDlg.h 加入控制变量BOOL isRepeat;类型可为Private。
同时修改OnInitDialog()函数:
BOOL CMediaPlayerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
isRepeat=FALSE;
……
}
6. 这样此播放器就具有一般的媒体播放功能了,但为了有更好的用户界面,我们给播放器加上皮肤。我们使用现在比较流行的Skin++ for VC++6.0作为皮肤控件给我们的播放器加上漂亮的皮肤。
(1)复制 SkinPPWTL.h、SkinPPWTL.dll、SkinPPWTL.lib 以及 Chinablue.ssk 皮肤到程序源码下。
(2)在 MFC 下:Project->Setting->Link->Object/library modules 处添加 SkinPPWTL.lib (左侧设置要选择“所有配置”)。
(3)点击菜单:Project->Add to Project->File 打开 SkinPPWTL.h 文件。
(4)在 StdAfx.h 中添加头文件:#include "SkinPPWTL.h"
(5)在MediaPlayerDlg.cpp类中的OnInitDialog()中加上skinppLoadSkin(_T("Chinablue.ssk"));
7.为了使界面更加美观,还要设置MediaPlayer对话框的样式,取消“系统菜单”的显示:
8. 全部完成,现在编译、连接并运行看看效果,打开个mp3文件试听一下,效果不错!
9.
:
这个播放器主要使用了ActiveX控件——ActiveMovieControl Object作为播放核心,界面简单的采用了若干按钮来控制播放。
再添加该控件时发现控件本身带有视频窗口,加大控件大小后就可以直接带有视频播放窗口了。进过测试完全可以播放更多的视频,于是修改OnOpen函数:
void CAbcDlg::OnOpen()
{
char szFileFilter[]=
"所有支持类型|*.mp3;*.wma;*.dat;*.wav;*.avi;*.mov;*.rmvb;*.mmm;*.mid;*.rmi;*.mpeg|"
"Mp3 File(*.mp3)|*.mp3|"
"Wma File(*.wma)|*.wma|"
"Video File(*.dat)|*.dat|"
"Wave File(*.wav)|*.wav|"
"AVI File(*.avi)|*.avi|"
"Movie File(*.mov)|*.mov|"
"Rmvb File(*.rmvb)|*.rmvb|"
"Media File(*.mmm)|*.mmm|"
"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"
"MPEG File(*.mpeg)|*.mpeg|"
"All File(*.*)|*.*||";//文件类型过滤
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK){
CString PathName=dlg.GetPathName();
PathName.MakeUpper();
m_ActiveMovie.SetFileName(PathName);
}
}