📄 cavi.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 + -