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

📄 aviplayerdoc.cpp

📁 这是一个编程开发用的AVI的播放器对初学者有启发作用
💻 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 + -