📄 aviplayerdoc.cpp
字号:
// AVIPlayerDoc.cpp : implementation of the CAVIPlayerDoc class
//
#include "stdafx.h"
#include "AVIPlayer.h"
#include "AVIPlayerDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerDoc
IMPLEMENT_DYNCREATE(CAVIPlayerDoc, CDocument)
BEGIN_MESSAGE_MAP(CAVIPlayerDoc, CDocument)
//{{AFX_MSG_MAP(CAVIPlayerDoc)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerDoc construction/destruction
CAVIPlayerDoc::CAVIPlayerDoc()
{
// TODO: add one-time construction code here
m_bOpened=false;
}
CAVIPlayerDoc::~CAVIPlayerDoc()
{
if(m_bOpened)
{
AVIFileExit();
HeapFree(GetProcessHeap(),0,m_lpBuffer);
}
}
BOOL CAVIPlayerDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerDoc serialization
void CAVIPlayerDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerDoc diagnostics
#ifdef _DEBUG
void CAVIPlayerDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CAVIPlayerDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerDoc commands
void CAVIPlayerDoc::OnFileOpen()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,"AVI文件(.avi)|*.avi||",NULL,OFN_HIDEREADONLY,
"AVI文件(.avi)|*.avi||",NULL);
CString filename;
if(dlg.DoModal()==IDOK)
{
filename=dlg.GetPathName();
HRESULT hr;
AVIFileInit();
//打开一个avi文件
hr=AVIFileOpen(&m_pFile,
filename,
OF_SHARE_DENY_NONE|OF_READ,
NULL);
if(hr!= AVIERR_OK)
{
AVIFileExit();
AfxMessageBox("无法打开AVI文件");
return;
}
// 创建视频流;
AVIFileGetStream(m_pFile,&m_pStream,streamtypeVIDEO,0);
if (hr != AVIERR_OK)
{
AVIFileExit();
AfxMessageBox("无法打开AVI文件");
return;
}
//得到avi信息
m_pStreamInfo=new AVISTREAMINFO;
AVIStreamInfo(m_pStream,m_pStreamInfo,sizeof(AVISTREAMINFO));
// 获得avi帧率,单位:帧每秒
m_nRate=m_pStreamInfo->dwRate;
RECT recFrame;
// 得到avi窗口大小
recFrame=m_pStreamInfo->rcFrame;
// 得到图象长度
m_nWidth=abs(recFrame.right-recFrame.left);
// 得到图象高度
m_nHeight=abs(recFrame.top-recFrame.bottom);
// 得到总帧数
m_nFrame=m_pStreamInfo->dwLength;
//填充bmp信息头用于显示,填充BITMAPINFOHEADER结构
// 是24位色
m_strtInfo.bmiHeader.biBitCount=24;
// 重要颜色数为零
m_strtInfo.bmiHeader.biClrImportant=0;
m_strtInfo.bmiHeader.biClrUsed=0;
// 是不压缩的位图
m_strtInfo.bmiHeader.biCompression=0;
// 设置图象高度
m_strtInfo.bmiHeader.biHeight=m_nHeight;
// 设置图象宽度
m_strtInfo.bmiHeader.biWidth=m_nWidth;
// 设置位平面
m_strtInfo.bmiHeader.biPlanes=1;
// 设置BITMAPINFOHEADER结构大小
m_strtInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
// 每行字节数,补齐到4字节的整数倍
int linewidth=(m_nWidth*3+3)/4*4;
// 设置图象大小
m_strtInfo.bmiHeader.biSizeImage=linewidth*m_nHeight;
m_strtInfo.bmiHeader.biXPelsPerMeter=3270;
m_strtInfo.bmiHeader.biYPelsPerMeter=3270;
//为图象申请空间
m_lpBuffer=(BYTE*)HeapAlloc(GetProcessHeap(),0,m_strtInfo.bmiHeader.biSizeImage);
m_bOpened=true;
//当前显示的帧
m_nCurFrame=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -