⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mciaviplay.cpp

📁 VC++6开发指南的源代码第24章-第25章
💻 CPP
字号:
// MCIAviPlay.cpp: implementation of the CMCIAviPlay class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "AVIMCIDemo.h"
#include "MCIAviPlay.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMCIAviPlay::CMCIAviPlay()
{
	//初始化状态变量
	m_bOpen = FALSE;
	m_bPause = FALSE;
	m_bPlaying = FALSE;
	m_wDeviceID = NULL;
}

CMCIAviPlay::~CMCIAviPlay()
{
	Close();    // 关闭视频设备
}
int CMCIAviPlay::Open(CString FileName, CWnd* pWnd, int left, int top, int width, int height)
{
	if (!m_bOpen)      // 如果m_bOpen=FALSE,没有打开设备
	{
		//初始化数据成员
		m_bOpen = m_bPause = m_bPlaying = FALSE;
		m_wDeviceID = NULL;
		//判断数字视频文件是否存在
		CFileStatus fileStatus;
		if (!CFile::GetStatus(FileName, fileStatus))
				 return 0;
		//打开设备,并获的视频设备的ID号
		MCI_DGV_OPEN_PARMS mciOpenParms;
		mciOpenParms.lpstrDeviceType = "AviVideo";    //设置播放设备为视频播放设备
		mciOpenParms.lpstrElementName = (LPSTR)FileName.GetBuffer(0);  //赋给文件名
		mciOpenParms.wDeviceID = NULL;
		mciOpenParms.hWndParent = pWnd->m_hWnd;  //可播放视频文件窗口指针
		mciOpenParms.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)&mciOpenParms))
		{
			return 0;
		}
		m_wDeviceID = mciOpenParms.wDeviceID;
		m_bOpen = TRUE;    //表示视频设备已经被正确获得
		// 对视频设备的播放进行初始化
		MCI_DGV_SET_PARMS mciSetParms;
		mciSetParms.dwTimeFormat = MCI_FORMAT_FRAMES;// 设置视频文件播放单位为帧
		if (mciSendCommand(m_wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)& mciSetParms))
		{
			Close();
			return 0;    //表示打开设备时出错
		}
		// 把视频文件当前的位置设为开始位置
		mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
		// 将播放画面置于pWnd窗口之中
		MCI_DGV_PUT_PARMS mciPutParms;
		mciPutParms.rc.left = left;
		mciPutParms.rc.top = top;        //视频播放窗口左上角的坐标
		mciPutParms.rc.right = left + width;
		mciPutParms.rc.bottom = top + height;
		if (mciSendCommand(m_wDeviceID, MCI_PUT, MCI_WAIT |MCI_DGV_PUT_CLIENT | MCI_DGV_PUT_WINDOW | MCI_DGV_RECT, (DWORD)(LPVOID)& mciPutParms))
		{
			Close();
			return 0;
		}
	}
	return 1;
}
int CMCIAviPlay::Play(int Loop, int FullScreen)
{
	if (m_bOpen)
	{
		// 如果是视频的尾部则重新开始播放
		if (GetFrame()>=GetFrames())
			mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
		// 在当前位置开始播放
		MCI_DGV_PLAY_PARMS mciPlayParms;
		mciPlayParms.dwCallback = NULL;
		mciPlayParms.dwFrom = GetFrame();    // 得到当前的视频位置
		DWORD dwFlags = MCI_FROM;
		if (Loop)
			dwFlags |=MCI_DGV_PLAY_REPEAT;    //循环播放标志
		if (FullScreen)
			dwFlags |=MCI_MCIAVI_PLAY_FULLSCREEN;    //全屏幕播放标志
		if (mciSendCommand(m_wDeviceID, MCI_PLAY, dwFlags, (DWORD)(LPVOID)&mciPlayParms))
		{
			return 0;
		}
		m_bPause = FALSE;
		m_bPlaying = TRUE;
		return 1;
	}
	return 1;
}
void CMCIAviPlay::Close()
{
	if (m_bOpen)
	{
		mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);    // 发送停止消息
		mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL);  // 发送关闭消息
		m_bOpen = m_bPause = m_bPlaying = FALSE;
	    m_wDeviceID = NULL;
	}
}
void CMCIAviPlay::Stop()
{
	if (m_bOpen && m_bPlaying)
	{
		mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL);
		mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
		m_bPause = TRUE;
	    m_bPlaying = FALSE;
	}
}
void CMCIAviPlay::Pause()
{
	if (m_bOpen)
	{
		MCI_DGV_PAUSE_PARMS mciPauseParms;
		if (mciSendCommand(m_wDeviceID, MCI_PAUSE, NULL,
		(DWORD)(LPVOID) & mciPauseParms))
			return;
		m_bPause = TRUE;
	}
}
void CMCIAviPlay::Forward(int nFrames)
{
	if (m_bOpen)
	{
		if (m_bPlaying && !m_bPause)
			Pause();
		MCI_DGV_STEP_PARMS mciStepParms;
		mciStepParms.dwFrames = nFrames;
		mciSendCommand(m_wDeviceID, MCI_STEP, MCI_DGV_STEP_FRAMES, 
		(DWORD)(LPVOID)&mciStepParms);
	}
}
void CMCIAviPlay::Backward(int nFrames)
{
	if (m_bOpen)
	{
		if (m_bPlaying && !m_bPause)
			Pause();
		MCI_DGV_STEP_PARMS mciStepParms;
		mciStepParms.dwFrames = nFrames;
		mciSendCommand(m_wDeviceID, MCI_STEP, MCI_DGV_STEP_REVERSE | 
		MCI_DGV_STEP_FRAMES, (DWORD)(LPVOID)&mciStepParms);
	}
}
void CMCIAviPlay::SetSpeed(int nSpeed)
{
	if (m_bOpen)
	{
		MCI_DGV_SET_PARMS mciSetParms;
		mciSetParms.dwSpeed = nSpeed;
		mciSendCommand(m_wDeviceID, MCI_SET, MCI_WAIT | MCI_DGV_SET_SPEED,
		(DWORD)(LPVOID)&mciSetParms);
	}
}
BOOL CMCIAviPlay::SeekTo(int nFrame)
{
	if (m_bOpen)
	{
		MCI_SEEK_PARMS mciSeekParms;
		mciSeekParms.dwTo = nFrame;
		if (m_bPlaying && !m_bPause)
		    mciSendCommand(m_wDeviceID, MCI_PAUSE, 0, NULL);
	    if (mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_TO | MCI_WAIT,
	      (DWORD)(LPVOID)&mciSeekParms))
        	return FALSE;
		if (m_bPlaying && m_bPause)
			Play();
		return TRUE;
	}
	return FALSE;
}
int CMCIAviPlay::GetFrames()
{
	if (m_bOpen)
	{
		MCI_DGV_STATUS_PARMS mciStatusParms;
	    mciStatusParms.dwItem = MCI_STATUS_LENGTH;
		if (mciSendCommand(m_wDeviceID, MCI_STATUS, MCI_WAIT |
		MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms))
			return 0;
		return (int)mciStatusParms.dwReturn;
	}
	return 0;
}
int CMCIAviPlay::GetFrame()
{
	if (m_bOpen)
	{
		MCI_DGV_STATUS_PARMS mciStatusParms;
		mciStatusParms.dwItem = MCI_STATUS_POSITION;
		if (mciSendCommand(m_wDeviceID, MCI_STATUS, MCI_WAIT |
		MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms))
			return -1;
		return (int)mciStatusParms.dwReturn;
	}
	return -1;
}
int CMCIAviPlay::GetSpeed()
{
	if (m_bOpen)
	{
		MCI_DGV_STATUS_PARMS mciStatusParms;
		mciStatusParms.dwItem = MCI_DGV_STATUS_SPEED;
		if (mciSendCommand(m_wDeviceID, MCI_STATUS, MCI_WAIT |
		MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms))
			return -1;
		return (int)mciStatusParms.dwReturn;
	}
	return -1;
}
BOOL CMCIAviPlay::IsPlaying()
{
	if (m_bOpen)
	{
		MCI_DGV_STATUS_PARMS mciStatusParms;
		mciStatusParms.dwItem = MCI_STATUS_MODE;
		if (mciSendCommand(m_wDeviceID, MCI_STATUS, MCI_WAIT |
			MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms))
			return FALSE;
		if (mciStatusParms.dwReturn == MCI_MODE_PLAY)
		{
			m_bPlaying = TRUE;
			m_bPause = FALSE;
			return TRUE;
		}
		else if(mciStatusParms.dwReturn == MCI_MODE_PAUSE)
		{
			m_bPlaying = TRUE;
			m_bPause = TRUE;
			return TRUE;
		}
		else
		{
			m_bPlaying = FALSE;
			m_bPause = FALSE;
			return FALSE;
		}
	}
	return FALSE;
}
int CMCIAviPlay::GetWidth()
{
	if (m_bOpen)
	{
		MCI_DGV_WHERE_PARMS mciWhereParms;
		if (mciSendCommand(m_wDeviceID, MCI_WHERE,
			MCI_DGV_WHERE_SOURCE, (DWORD)(LPVOID)&mciWhereParms))
			return 0;
		return (int) mciWhereParms.rc.right;
	}
	return 0;
}
int CMCIAviPlay::GetHeight()
{
	if (m_bOpen)
	{
		MCI_DGV_WHERE_PARMS mciWhereParms;
		if (mciSendCommand(m_wDeviceID, MCI_WHERE,
		MCI_DGV_WHERE_SOURCE, (DWORD)(LPVOID)&mciWhereParms))
			return 0;
		return (int) mciWhereParms.rc.bottom;
	}
	return 0;
}
BOOL CMCIAviPlay::GetPause()
{
	if (m_bOpen)
	{
		MCI_DGV_STATUS_PARMS mciStatusParms;
		mciStatusParms.dwItem = MCI_STATUS_MODE;
		if (mciSendCommand(m_wDeviceID, MCI_STATUS, MCI_WAIT |
			MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms))
			return FALSE;
		if(mciStatusParms.dwReturn == MCI_MODE_PAUSE)
		{
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
	else
	{
		return FALSE;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -