前几天突然间心血来潮,打算自己用VC做一个媒体播放器,于是到网上搜索了一下,发现有很多好心人贴出了很多例子(很是感谢),一些是VC6写的,一些是VC2003/2005写的,都是直接通过wmp.dll(WINDOW MEDIA PLAYER9带的ACTIVE控件,存放在C:\WINDOWS\system32目录下。本人对VC6有点排斥(哈哈,就是觉得其C++标准支持太差了,故一般做项目时不考虑,实在没办法的时候才采用),就直接开始在VC2005下按照提示编写了。
开始总是一样:
1、添加一个解决方案;
2、在解决方案下添加一个MFC对话框程序;
3、编辑对话框资源的时候,在左边的工具栏上通过选择项-》COM组件,选择Windows Media Player进行添加,添加之后工具栏上即多了一个Windows Media Player项,把其拉到设计窗口中,选择其属性,设置enableContextMenu为true,即允许播放器弹出菜单;
4、给对话框添加菜单,菜单功能很简单,就是文件-》打开/退出;
在资源窗口中通过右键选择添加一个MENU,默认为IDR_MENU1,然后在对话框的属性中把Menu设置为IDR_MENU1,此时即在对话框中加入了菜单:
5、实现子菜单项的打开功能:
在资源窗口的打开子菜单中,点击右键,选择添加事件处理,消息选择COMMAND,类列表选择Dlg的那个,此时即可编辑函数:
void CMPlayDlg::On32771()
{
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()); // 传递媒体文件到播放器
}
}
6、实现窗口的WMSIZE:
由于窗口大小会产生改变,所以窗口中的视频窗口也要作相应的变动,故需要实现窗口的WM_SIZE函数:
void CMPlayDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (m_ctrlMPlayer)
{
m_ctrlMPlayer.MoveWindow(0, 0, cx-40, cy);
}
}
注:没加上 if (m_ctrlMPlayer)之前DEBUG总是报错,RELEASE倒是没事,后来我想应该是程序启动时,m_ctrlMPlayer还没有初始化,故报错。
这样一个简单的播放器就做成了。
由于我想要查看一下当前播放的媒体的名称以及想查看进度,故需要引进CWMPMedia和CWMPControls一类的控制对象,所以在解决方案的资源管理器中右键-》添加类-》MFC-》ACTIVEX中的MFC类-》下拉列表中选择Windows Media Player<1.0>,然后选择左边的一些相关类拉到右边来,确定即可,此时这些类对应的H和CPP文件就都加了进来;
我想控制播放器的播放,参考了网上的一些代码,所以:
m_control = m_ctrlMPlayer.get_controls();
double d = m_control.get_currentPosition();
d = d+1;
CWMPMedia m_media = static_cast<CWMPMedia>(m_ctrlMPlayer.get_currentMedia());
CString s = m_media.get_name();
哈哈,总是编译不通过,后来查了一下,发现CWMPControls是继承自CWnd,所以从网上抄了CWMPControls继承自COleDispatchDriver的H和CPP的代码。编译通过(为了寻找这个问题,花了不少时间)。
哈哈,借花献佛,希望有碰到同样的问题的朋友少走点弯路。