
2用embed方法插入例如下列格式: <Embed src="url"width="宽度"height="高度"AUTOSTART="TRUE│false" LOOP="TRUE"></Embed>
CDigitalvideo::CDigitalvideo(){
// 初始化成员变量
m_Open = m_Pause = m_Playing = FALSE
m_DeviceID = 0
}
CDigitalvideo::~CDigitalvideo()
{
Close ()
}
BOOL CDigitalvideo::GetPause ()//是否暂停
{
return m_Pause
}
BOOL CDigitalvideo::Open (CString Filename, CWnd *pWnd, int left, int top,int width,int height)
{
if (!m_Open){//如果m_Open=false,没有打开设备
// 初始化成员变量
m_Open = m_Pause = m_Playing = FALSE
m_DeviceID = 0
// 文件是否存在
CFileStatus Status
if (!CFile::GetStatus (Filename, Status))
return FALSE
// 打开设备
MCI_DGV_OPEN_PARMS MCIOpen
MCIOpen.lpstrDeviceType = "avivideo"//设置播放设备为视频播放设备
MCIOpen.lpstrElementName = (LPSTR) Filename.GetBuffer (0)//文件名
MCIOpen.wDeviceID = NULL
MCIOpen.hWndParent = pWnd->m_hWnd//可播放视频文件窗口指针
MCIOpen.dwStyle = WS_CHILD | WS_VISIBLE
if (mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE |
MCI_OPEN_ELEMENT | MCI_DGV_OPEN_PARENT | MCI_DGV_OPEN_WS, (DWORD)(LPVOID) &MCIOpen))
return FALSE
m_DeviceID = MCIOpen.wDeviceID
m_Open = TRUE
// 将文件长度设置为帧
MCI_DGV_SET_PARMS MCISet
MCISet.dwTimeFormat = MCI_FORMAT_FRAMES
if (mciSendCommand (m_DeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &MCISet)){
Close ()
return FALSE
}
// 找到视频文件的开始位置
mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL)
//将播放画面置于主窗口之中
MCI_DGV_PUT_PARMS MCIPut
MCIPut.rc.left = left
MCIPut.rc.top = top
MCIPut.rc.right = width
MCIPut.rc.bottom = height
if (mciSendCommand (m_DeviceID, MCI_PUT, MCI_WAIT | MCI_DGV_PUT_CLIENT |
MCI_DGV_PUT_WINDOW | MCI_DGV_RECT, (DWORD)(LPVOID) &MCIPut)){
Close ()
return FALSE
}
}
return TRUE
}
void CDigitalvideo::Close (void)
{
if (m_Open){// 停止播放并关闭设备
if (m_Playing || m_Pause)
mciSendCommand (m_DeviceID, MCI_STOP, NULL, NULL)
mciSendCommand (m_DeviceID, MCI_CLOSE, NULL, NULL)
// 清空成员变量
m_Open = m_Pause = m_Playing = FALSE
m_DeviceID = NULL
}
}
//获得视频文件窗口的宽度
int CDigitalvideo::GetWidth (void)
{
if (m_Open){
MCI_DGV_WHERE_PARMS MCIWhere
if (mciSendCommand (m_DeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE,
(DWORD)(LPVOID) &MCIWhere)){
return 0
}
return (int) MCIWhere.rc.right
}
return 0
}
//获得视频文件窗口的高度
int CDigitalvideo::GetHeight (void)
{
if (m_Open){
MCI_DGV_WHERE_PARMS MCIWhere
if (mciSendCommand (m_DeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE,
(DWORD)(LPVOID) &MCIWhere)){
return 0
}
return (int) MCIWhere.rc.bottom
}
return 0
}
BOOL CDigitalvideo::Play (BOOL bLoop, BOOL bFullScreen)
{
if (m_Open){
// 如果是视频的尾部则重新开始播放
if (GetFrame () >= GetFrames ())
mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL)
// 播放
MCI_DGV_PLAY_PARMS MCIPlay
MCIPlay.dwCallback = NULL
MCIPlay.dwFrom = GetFrame ()
DWORD dwFlags = MCI_FROM
if (bLoop)
dwFlags |= MCI_DGV_PLAY_REPEAT
if (bFullScreen)
dwFlags |= MCI_MCIAVI_PLAY_FULLSCREEN
if (mciSendCommand (m_DeviceID, MCI_PLAY, dwFlags, (DWORD)(LPVOID) &MCIPlay))
return FALSE
m_Pause = FALSE
m_Playing = TRUE
return TRUE
}
return FALSE
}
void CDigitalvideo::Stop (void)
{
if (m_Open &&m_Playing){
mciSendCommand (m_DeviceID, MCI_STOP, NULL, NULL)
mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL)
m_Playing = FALSE
m_Pause = TRUE
}
}
void CDigitalvideo::Pause( void )
{
if (m_Open ){
MCI_DGV_PAUSE_PARMS MCIPause
if (mciSendCommand (m_DeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &MCIPause))
return
m_Pause = TRUE
}
}
int CDigitalvideo::GetFrames (void)
{
if (m_Open){
MCI_DGV_STATUS_PARMS MCIStatus
MCIStatus.dwItem = MCI_STATUS_LENGTH
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return 0
return (int) MCIStatus.dwReturn
}
return 0
}
int CDigitalvideo::GetFrame (void)
{
if (m_Open){
MCI_DGV_STATUS_PARMS MCIStatus
MCIStatus.dwItem = MCI_STATUS_POSITION
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return -1
return (int) MCIStatus.dwReturn
}
return -1
}
BOOL CDigitalvideo::IsPlaying ()
{
if (m_Open)
{
MCI_DGV_STATUS_PARMS MCIStatus
MCIStatus.dwItem = MCI_STATUS_MODE
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return FALSE
if (MCIStatus.dwReturn == MCI_MODE_PLAY)
{
m_Playing = TRUE
m_Pause = FALSE
return TRUE
}
else if (MCIStatus.dwReturn == MCI_MODE_PAUSE)
{
m_Playing = TRUE
m_Pause = FALSE
return TRUE
}
else
{
m_Playing = FALSE
m_Pause = FALSE
return FALSE
}
}
return FALSE
}
BOOL CDigitalvideo::SeekTo (int nFrame)
{
if (m_Open){
MCI_SEEK_PARMS MCISeek
MCISeek.dwTo = nFrame
if (m_Playing &&!m_Pause)
mciSendCommand (m_DeviceID, MCI_PAUSE, 0, NULL)
if (mciSendCommand (m_DeviceID, MCI_SEEK, MCI_TO |
MCI_WAIT, (DWORD)(LPVOID) &MCISeek))
return FALSE
if (m_Playing &&!m_Pause)
Play ()
return TRUE
}
return FALSE
}
void CDigitalvideo::Forward (int nFrames)
{
if (m_Open){
if (m_Playing &&!m_Pause)
Pause ()
MCI_DGV_STEP_PARMS MCIStep
MCIStep.dwFrames = nFrames
mciSendCommand (m_DeviceID, MCI_STEP, MCI_DGV_STEP_FRAMES,
(DWORD)(LPVOID) &MCIStep)
}
}
void CDigitalvideo::Backward (int nFrames)
{
if (m_Open){
if (m_Playing &&!m_Pause)
Pause ()
MCI_DGV_STEP_PARMS MCIStep
MCIStep.dwFrames = nFrames
mciSendCommand (m_DeviceID, MCI_STEP, MCI_DGV_STEP_REVERSE |
MCI_DGV_STEP_FRAMES, (DWORD)(LPVOID) &MCIStep)
}
}
int CDigitalvideo::GetSpeed (void)
{
if (m_Open){
MCI_DGV_STATUS_PARMS MCIStatus
MCIStatus.dwItem = MCI_DGV_STATUS_SPEED
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return -1
return (int) MCIStatus.dwReturn
}
return -1
}
void CDigitalvideo::SetSpeed (int nSpeed)
{
if (m_Open){
MCI_DGV_SET_PARMS MCISet
MCISet.dwSpeed = nSpeed
mciSendCommand (m_DeviceID, MCI_SET, MCI_WAIT |
MCI_DGV_SET_SPEED, (DWORD)(LPVOID) &MCISet)
}
}
/*void CDigitalvideo::SetSound (BOOL bSound)
{
if (m_Open)
{
MCI_DGV_SET_PARMS MCISet
MCISet.dwAudio = MCI_SET_AUDIO_ALL
DWORD dwFlags = MCI_SET_AUDIO
if (bSound)
dwFlags |= MCI_SET_ON
else
dwFlags |= MCI_SET_OFF
mciSendCommand (m_DeviceID, MCI_SET, dwFlags, (DWORD)(LPVOID) &MCISet)
}
}
BOOL CDigitalvideo::GetSound (void)
{
if (m_Open)
{
MCI_DGV_STATUS_PARMS MCIStatus
MCIStatus.dwItem = MCI_DGV_STATUS_AUDIO
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return FALSE
if (MCIStatus.dwReturn == MCI_ON)
return TRUE
else
return FALSE
}
return FALSE
}*/
建立一个对话框 IDD_PLAYER_DIALOG在对话框上单击右键,选择添加类,基类选择CDialog, 类名CPlayer,确定,生成CPlayer类
.
在对话框上单击右键,选择插入Activex控件,拖到底部,选择windows media player,确定
,控件被加入.
关闭资源视图.
选择菜单, 项目->添加类, 在模板中选择"在Activex控件中的MFC类".在"可用的Activex
控件"下拉菜单中选择"Windows Media Player", 在左下方的接口栏中出现可以选择的类
的接口,选择需要的接口即可,这里选择IWMPPlyaer4,单击完成生成类CWMPPlayer4.
打开资源视图,在对话框的wmp控件上单击右键,添加变量, 变量类型输入CWMPPlayer4,变
量名m_ctrlPlayer.
调用m_ctrlPlayer.put_url() 可以播放媒体文件. ------------
-------------------------------------------------------------
件——》新建——》项目,选择MFC应用程序——》名称为player——》确定。
点击应用程序类型——》基于对话框——》完成。
在DIALOG中右击——》插入ACTIVEX控件——》选Windows Media Player ,添加了Windows Media Player 控件ID为IDC_OCX1。
对Windows Media Player控件右击——》添加变量——》变量名为m_wmplayer——》完成。
拉二个按钮到DIALOG中“打开”和“暂停”,双击“打开”输入以下代码:
// TODO: 在此添加控件通知处理程序代码
TCHAR szFileFilter[]= _T("Mp3 File(*.mp3)|*.mp3|MPEG File(*.mpeg)|*.mpeg|Media File(*.asf)|*.asf|Video File(*.dat)|*.dat|MPGA File(*.mpga)|*.mpga|Wave File(*.wav)|*.wav|AVI File(*.avi)|*.avi|Movie File(*.mov)|*.mov|Mid File(*.mid*,rmi)|*.mid*.rmi|Wma File(*.wma)|*.wma|All File(*.*)|*.*||")
CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this)
if (fileDialog.DoModal() == IDOK)
{
CString fileName=fileDialog.GetPathName()
m_wmplayer.put_URL(fileName)
}
到此时一切正常~
然后右击类视图/解决方案—〉添加类—〉选择“Active中的MFC类”—〉选择windows media player <1.0>选择所有接口生成类。
在然后在对话框头文件中(playerDlg.h)添加了以下变量:
CWMPControls m_control
在playerDlg.cpp的OnInitDialog()中添加代码:
m_control = static_cast <CWMPControls>(m_wmPlayer.get_controls())
双击“暂停”输入
// TODO: 在此添加控件通知处理程序代码
m_control.pause()
void CPlayerDlg::OnBnClickedButtonOpen()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szFileFilter[]= _T("Mp3 File(*.mp3)|*.mp3|MPEG File(*.mpeg)|*.mpeg|Media File(*.asf)|*.asf|Video File(*.dat)|*.dat|MPGA File(*.mpga)|*.mpga|Wave File(*.wav)|*.wav|AVI File(*.avi)|*.avi|Movie File(*.mov)|*.mov|Mid File(*.mid*,rmi)|*.mid*.rmi|Wma File(*.wma)|*.wma|All File(*.*)|*.*||")
CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this)
if (fileDialog.DoModal() == IDOK)
{
CString fileName=fileDialog.GetPathName()
m_conWMPlayer.put_URL(fileName)
}
}
void CPlayerDlg::OnBnClickedButtonStop()
{
// TODO: 在此添加控件通知处理程序代码
m_CWMPConcontrol.pause()
}
BOOL CPlayerDlg::OnInitDialog()
{
CDialog::OnInitDialog()
//todo
m_CWMPConcontrol=static_cast<CWMPControls>(m_conWMPlayer.get_controls())
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)