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

📄 cavi.cpp

📁 成熟的RPG引擎,Flysky发布. 斜视角引擎.
💻 CPP
字号:
#include "CAvi.h"

CVideo::CVideo()
{
IsPlay=false;
AviLength=0;
AviNow=0;
CoInitialize(NULL); //COM初始化
}
CVideo::~CVideo()
{
	if (IsPlay==true) UnInit();
}

void CVideo::UnInit()
{
	if (pGB!=NULL){pGB->Release();pGB=NULL;}
	if (pMC!=NULL){pMC->Release();pMC=NULL;}
	if (pME!=NULL){pME->Release();pME=NULL;}
	if (pVW!=NULL){pVW->Release();pVW=NULL;}
	if (pMP!=NULL){pMP->Release();pMP=NULL;}
}

bool CVideo::Play(LPSTR szFile,HWND HwnD)
{
  HRESULT hr; //返回值
  WCHAR wFile[MAX_PATH];
    MultiByteToWideChar( CP_ACP, 0, szFile, -1, wFile, MAX_PATH );
    Stop();
	hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder,(void **)&pGB);
    pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
    pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME);
    pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW);
	pGB->QueryInterface(IID_IMediaPosition, (void **)&pMP);
	pGB->RenderFile(wFile,NULL);
	pVW->put_Owner((OAHWND)HwnD);
	pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
	pVW->SetWindowPosition(0,0,GetSystemMetrics(0),GetSystemMetrics(1));
	pMP->put_CurrentPosition(0); //0秒开始播放
	pMP->get_Duration(&AviLength);
	AviNow=0;
	hr = pMC->Run();
	IsPlay=true;
  return true;
}

//用循环,一直播放,一直到结束
bool CVideo::StrPlay(LPSTR szFile,HWND HwnD)
{
  HRESULT hr; //返回值
  WCHAR wFile[MAX_PATH];
    MultiByteToWideChar( CP_ACP, 0, szFile, -1, wFile, MAX_PATH );
  Stop();
	hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder,(void **)&pGB);
    pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
    pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME);
    pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW);
	pGB->QueryInterface(IID_IMediaPosition, (void **)&pMP);
	pGB->RenderFile(wFile,NULL);
	pVW->put_Owner((OAHWND)HwnD);
	pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
	pVW->SetWindowPosition(0,0,GetSystemMetrics(0),GetSystemMetrics(1));
	pMP->put_CurrentPosition(0); //0秒开始播放
	pMP->get_Duration(&AviLength);
	AviNow=0;
	IsPlay=true;
	MSG msg; //消息
	for (;;)
	{
	//消息接收
	if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
	{
			if(msg.message==WM_QUIT)
			{
				PostQuitMessage(0);
				break;
			}
	TranslateMessage(&msg); 
	DispatchMessage(&msg);
	}
	pMP->get_CurrentPosition(&AviNow);
	hr = pMC->Run();
	if (AviNow>=AviLength) 
		{
			IsPlay=false;
		}
		if (IsPlay==false)
		{
			UnInit();
			break;
		}
	}
  return true;
}

void CVideo::Stop() //只用于不带循环的那个接受事件的
{
	if (IsPlay==true)
	{
	pMC->Stop(); //停止视频
	IsPlay=false;
	UnInit();
	}
}

bool CVideo::IsPlayMovie()
{
	if (IsPlay==true)
	{
	pMP->get_Duration(&AviLength);
	pMP->get_CurrentPosition(&AviNow);
	if (AviNow>=AviLength) 
	{
		IsPlay=false;
		UnInit();
	//
	}
	}
return IsPlay;
}

⌨️ 快捷键说明

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