📄 aviplayerview.cpp
字号:
// AVIPlayerView.cpp : implementation of the CAVIPlayerView class
//
#include "stdafx.h"
#include "AVIPlayer.h"
#include "AVIPlayerDoc.h"
#include "AVIPlayerView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerView
IMPLEMENT_DYNCREATE(CAVIPlayerView, CView)
BEGIN_MESSAGE_MAP(CAVIPlayerView, CView)
//{{AFX_MSG_MAP(CAVIPlayerView)
ON_WM_PAINT()
ON_WM_TIMER()
ON_COMMAND(ID_PLAY, OnPlay)
ON_COMMAND(ID_PAUSE, OnPause)
ON_COMMAND(ID_STOP, OnStop)
ON_UPDATE_COMMAND_UI(ID_PLAY, OnUpdatePlay)
ON_UPDATE_COMMAND_UI(ID_PAUSE, OnUpdatePause)
ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerView construction/destruction
CAVIPlayerView::CAVIPlayerView()
{
// TODO: add construction code here
m_bPaused = FALSE;
m_bPlaying = FALSE;
}
CAVIPlayerView::~CAVIPlayerView()
{
}
BOOL CAVIPlayerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerView drawing
void CAVIPlayerView::OnDraw(CDC* pDC)
{
CAVIPlayerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerView printing
BOOL CAVIPlayerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CAVIPlayerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CAVIPlayerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerView diagnostics
#ifdef _DEBUG
void CAVIPlayerView::AssertValid() const
{
CView::AssertValid();
}
void CAVIPlayerView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CAVIPlayerDoc* CAVIPlayerView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAVIPlayerDoc)));
return (CAVIPlayerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CAVIPlayerView message handlers
void CAVIPlayerView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CAVIPlayerDoc* pDoc=GetDocument();
if(pDoc->m_bOpened)
{
//得到当前要播放的帧的图象数据
AVIStreamRead(
pDoc->m_pStream,
pDoc->m_nCurFrame,
1,
pDoc->m_lpBuffer,
pDoc->m_strtInfo.bmiHeader.biSizeImage,
NULL,
NULL);
//显示
SetDIBitsToDevice(dc.m_hDC, //DIB将输出的设备描述表
0, //设备描述表中位图输出起始逻辑X坐标
0, //设备描述表中位图输出起始逻辑Y坐标
pDoc->m_nWidth, //DIB的宽度
pDoc->m_nHeight, //DIB的高度
0, //DIB开始读取输出的象素数据的X位置
0, //DIB开始读取输出的象素数据的Y位置
0, //DIB中象素的水平行号,它对应lpBits内存缓冲区第一行数据
pDoc->m_nHeight, //DIB的行数,对应包含在由lpBits所指内存缓冲区中的数据
pDoc->m_lpBuffer, //包含象素数据的内存缓冲区的指针
&pDoc->m_strtInfo,//指向初始化了的BITMAPINFO数据结构的指针,
//描述了位图的大小和色彩数据
DIB_RGB_COLORS); //指定是显示的颜色
}
// Do not call CView::OnPaint() for painting messages
}
void CAVIPlayerView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CAVIPlayerDoc* pDoc=GetDocument();
if(pDoc->m_bOpened && nIDEvent == IDEVENTPLAY)
{
// 已打开了一个AVI文件并且是特定的定时器事件
pDoc->m_nCurFrame++;
if (pDoc->m_nCurFrame >= pDoc->m_nFrame)
pDoc->m_nCurFrame = 0;
pDoc->UpdateAllViews(NULL,0,0);
}
CView::OnTimer(nIDEvent);
}
void CAVIPlayerView::OnPlay()
{
// TODO: Add your command handler code here
m_bPlaying = TRUE;
//启动定时器
this->Invalidate();
SetTimer(IDEVENTPLAY,(UINT)(1000.0 / GetDocument()->m_nRate),NULL);
}
void CAVIPlayerView::OnPause()
{
// TODO: Add your command handler code here
m_bPaused = !m_bPaused;
if (!m_bPaused)
OnPlay();
else
KillTimer(IDEVENTPLAY);
}
void CAVIPlayerView::OnStop()
{
// TODO: Add your command handler code here
KillTimer(IDEVENTPLAY);
GetDocument()->m_nCurFrame = 0;
m_bPlaying = FALSE;
m_bPaused = FALSE;
}
void CAVIPlayerView::OnUpdatePlay(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetDocument()->m_bOpened && !m_bPlaying);
}
void CAVIPlayerView::OnUpdatePause(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetDocument()->m_bOpened && m_bPlaying);
}
void CAVIPlayerView::OnUpdateStop(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetDocument()->m_bOpened && m_bPlaying);
}
void CAVIPlayerView::Play(int nFrame)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -