制作一个RealOne播放器,来播放RM视频格式的文件,以及流媒体文件。本实例需要添加RealOne组件,只要在系统中安装RealPlayer播放器后,就可以将RealOne组件添加到VC工程中。
(1)新建一个MFC工程对话框,并添加RealOne组件到该工程中。方法是Project->Add to Project->Components and Controls->Registered ActiveX Controls->RealPlayer G2 Control即可。这里所有的组件都是快捷方式,是直接指向操作系统的调用。添加完成后会自动在class view中新加一个类CRealAudio。
(2)然后在DLG类中点击右键,添加成员变量,类型为CRealAudio,名称是m_realplayer,用来操作RealOne组件,此操作会自动写上载入CRealAudio.h头文件。注意:删除成员变量需直接从代码中干掉,如果是删除不需要的成员函数,直接在类中DELETE即可。
(3)在对话框中,添加一个picture控件,和七个按钮控件。按钮名称分别是打开、暂停、停止、音量+、音量-、快递、快退。ID号分别是:IDC_REALPLAYER、IDC_BTOPEN、IDC_BTPAUSE、IDC_BTSTOP、IDC_BTSOUNDADD、IDC_BTSOUNDSUB、IDC_BTPROCADD、IDC_BTPROCSUB。
(4)分别给按钮添加代码,如下:
void CRealOnePlayerDlg::OnBtopen()
{
CString strname; //存储目标文件绝对路径
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,"realplay文件|*.*"); //为TRUE时打开文件,注意过滤类型
if (dlg.DoModal() == IDOK)
{
strname = dlg.GetPathName();
}
if (strname != "") //如果选了确定的文件
{
m_realplayer.SetSource(strname); //给m_realplayer设置源
m_realplayer.DoPlay(); //播放
}
}
void CRealOnePlayerDlg::OnBtpause()
{
if (m_realplayer.GetPlayState() == 0) //0含义不明
return;
CString text;
GetDlgItem(IDC_BTPAUSE)->GetWindowText(text); //获得当前按钮的属性,具体是获得按钮的文本
if (text == "暂停") //如果当前处于播放状态
{
m_realplayer.DoPause(); //暂停
GetDlgItem(IDC_BTPAUSE)->SetWindowText("播放"); //同时改变按钮指示,为播放
}
else //显示播放,说明当前处于停止状态
{
m_realplayer.DoPlay(); //继续播放
GetDlgItem(IDC_BTPAUSE)->SetWindowText("暂停"); //同时改变按钮指示,为暂停
}
}
void CRealOnePlayerDlg::OnBtstop()
{
m_realplayer.DoStop(); //停止播放
}
void CRealOnePlayerDlg::OnBtsoundadd()
{
short vl = 0;
if (m_realplayer.GetPlayState()==3) //3含义不明
{
vl = m_realplayer.GetVolume(); //获得当前音量
if (vl <= 90) //做大音量100
{
m_realplayer.DoPause();
m_realplayer.SetVolume(vl + 10); //以10为单位+
m_realplayer.DoPlay(); //先暂停,加完音量后再继续播放
}
}
else
{
if (vl <= 90)
{
m_realplayer.SetVolume(vl + 10);
}
}
}
void CRealOnePlayerDlg::OnBtsoundsub()
{
short vl = 0;
if (m_realplayer.GetPlayState() == 3)
{
vl = m_realplayer.GetVolume();
if (vl >= 10) //最小音量0
{
m_realplayer.DoPause();
m_realplayer.SetVolume(vl - 10); //以10为单位-
m_realplayer.DoPlay(); //先暂停,减完音量后再继续播放
}
}
else
{
if (vl >= 10)
{
m_realplayer.SetVolume(vl - 10);
}
}
}
void CRealOnePlayerDlg::OnBtprocadd()
{
if (m_realplayer.GetPlayState() == 3)
{
long pos = m_realplayer.GetPosition(); //时间概念
m_realplayer.DoPause();
m_realplayer.SetPosition(pos+2000); //2秒后的内容
m_realplayer.DoPlay();
}
}
void CRealOnePlayerDlg::OnBtprocsub()
{
if (m_realplayer.GetPlayState() == 3)
{
long pos = m_realplayer.GetPosition();
if (pos < 2000)
{
return;
}
m_realplayer.DoPause();
m_realplayer.SetPosition(pos - 2000); //2秒前的内容
m_realplayer.DoPlay();
}
}
(5)添加WM_TIMER消息和DestroyWindow消息处理
void CRealOnePlayerDlg::OnTimer(UINT nIDEvent)
{
m_realplayer.DoPlay();
CDialog::OnTimer(nIDEvent);
}
BOOL CRealOnePlayerDlg::DestroyWindow()
{
KillTimer(0); //默认TIMER0
return CDialog::DestroyWindow();
}
不过后来证明,删掉这两个处理一样正常。
(6)利用图片控件,对显示窗口的处理,在OnInitDialog末尾添加:
CRect rc; //矩形域
GetDlgItem(IDC_REALPLAYER)->GetWindowRect(rc); //把图片控件取成矩形域
ScreenToClient(&rc); //屏幕坐标转成窗口坐标
m_realplayer.Create("",WS_POPUP,rc,this,10000); //创建realplayer的
m_realplayer.ShowWindow(SW_SHOW);