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

📄 bmpmovieview.cpp

📁 vc程序设计技巧与实例中关于多媒体技术的vc++原代码
💻 CPP
字号:
// BMPMovieView.cpp : implementation of the CBMPMovieView class
//

#include "stdafx.h"
#include "BMPMovie.h"

#include "BMPMovieDoc.h"
#include "BMPMovieView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBMPMovieView

IMPLEMENT_DYNCREATE(CBMPMovieView, CView)

BEGIN_MESSAGE_MAP(CBMPMovieView, CView)
	//{{AFX_MSG_MAP(CBMPMovieView)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_WM_ERASEBKGND()
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CBMPMovieView construction/destruction

CBMPMovieView::CBMPMovieView()
{
	//设定定时器ID值
	m_IDTimer = 1;

	//创建所需的背景刷子
	CBitmap* pBitmap = new CBitmap;
	ASSERT(pBitmap);
	pBitmap->LoadBitmap(IDB_BKGROUND);
	m_BKBrush.CreatePatternBrush(pBitmap);

	//释放内存
	delete pBitmap;
}

CBMPMovieView::~CBMPMovieView()
{
}

BOOL CBMPMovieView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBMPMovieView drawing

void CBMPMovieView::OnDraw(CDC* pDC)
{
	CBMPMovieDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CBMPMovieView printing

BOOL CBMPMovieView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CBMPMovieView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CBMPMovieView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CBMPMovieView diagnostics

#ifdef _DEBUG
void CBMPMovieView::AssertValid() const
{
	CView::AssertValid();
}

void CBMPMovieView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CBMPMovieDoc* CBMPMovieView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBMPMovieDoc)));
	return (CBMPMovieDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBMPMovieView message handlers

int CBMPMovieView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
    //装载位图图象
	for (int i=0; i<FRAME_NUM; ++i)
		m_Bitmap[i].LoadBitmap(IDB_BITMAP1+i);

	BITMAP bm;
	m_Bitmap[0].GetBitmap(&bm);
	//获得图象的宽度
	m_nFrameWidth  = bm.bmWidth;
	//获得图象的高度
	m_nFrameHeight = bm.bmHeight;
	//计算水平和垂直方向的步进量
	m_nStepX = m_nFrameWidth/4;
	m_nStepY = m_nFrameHeight/4;

	//当前的显示位置
	m_ptCurPos = CPoint(0, 0);
	//开始显示的图象编号
	m_nCurFrameNo = 0;

	//设定定时器
	SetTimer(m_IDTimer, FRAME_TIME, NULL);
	
	return 0;
}

void CBMPMovieView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	m_ptCurPos = CPoint(0, 0);
	m_nCurFrameNo = 0;
	
}

void CBMPMovieView::OnTimer(UINT nIDEvent) 
{
	//清除上一幅显示的图象
	ClearLastFrame(m_ptCurPos);
	//计算下一次的显示位置
	CalcNewPos(m_ptCurPos);
	//显示一幅新的图象
	DisplayFrame(m_ptCurPos, m_nCurFrameNo);
	//计算下一幅需要显示的图象编号
	CalcNewFrameNo(m_nCurFrameNo);

	CView::OnTimer(nIDEvent);
}

/**********************************************************************
函数名:ClearLastFrame
用途:  清除上一幅显示的图象
参数:  ptCurPos[in],当前显示的图象位置
返回值:
**********************************************************************/
void CBMPMovieView::ClearLastFrame(CPoint ptCurPos)
{
	//获得上一次显示的图象的矩形区大小
	CRect rect(ptCurPos.x, 
			 ptCurPos.y, 
			 ptCurPos.x+m_nFrameWidth, 
			 ptCurPos.y+m_nFrameHeight);
	//使这个矩形区域无效
	InvalidateRect(&rect);
	//更新窗口显示
	UpdateWindow();
}

/**********************************************************************
函数名:CalcNewPos
用途:  计算下一帧图象的显示位置
参数:  ptCurPos[in][out],传入时记录的是上帧图象的显示位置,调用结束
		时返回新的图象的显示位置
返回值:
**********************************************************************/
void CBMPMovieView::CalcNewPos(CPoint& ptCurPos)
{
	//获取客户区矩形大小
	CRect ClientRect;
	GetClientRect(&ClientRect);

	//计算新的显示位置
	if (ptCurPos.x+m_nFrameWidth+m_nStepX >= ClientRect.right ||
		ptCurPos.x+m_nStepX <= ClientRect.left)
		m_nStepX = -m_nStepX;

	if (ptCurPos.y+m_nFrameHeight+m_nStepY >= ClientRect.bottom ||
		ptCurPos.y+m_nStepY <= ClientRect.top)
		m_nStepY = -m_nStepY;

	ptCurPos.x += m_nStepX; 
	ptCurPos.y += m_nStepY;
	
}

/**********************************************************************
函数名:CalcNewFrameNo
用途:  计算下一帧需要显示的图象编号
参数:  nCurFrameNo[in][out],传入时记录的是上帧显示的图象编号,调用
		结束返回下帧需要显示的图象编号
返回值:
**********************************************************************/

void CBMPMovieView::CalcNewFrameNo(int& nCurFrameNo)
{
	nCurFrameNo++;
	if (nCurFrameNo >= FRAME_NUM)
		nCurFrameNo = 0;
}

/**********************************************************************
函数名:DisplayFrame
用途:  显示一帧图象
参数:  ptPos[in],当前的图象显示位置;nFrameNo[in],需要显示的图象编号
返回值:
**********************************************************************/
BOOL CBMPMovieView::DisplayFrame(CPoint ptPos, int nFrameNo) 
{
	CClientDC dc(this);
	CDC MemDC;
	if (! MemDC.CreateCompatibleDC(&dc))
		return FALSE;

	CBitmap *pOldBitmap = (CBitmap *)MemDC.SelectObject(&m_Bitmap[nFrameNo]);

	dc.BitBlt(ptPos.x, ptPos.y,
			  m_nFrameWidth, m_nFrameHeight,
			  &MemDC,
			  0, 0,
			  SRCCOPY);

	MemDC.SelectObject(pOldBitmap);

	return TRUE;
}

void CBMPMovieView::OnDestroy() 
{
	CView::OnDestroy();
	
	//清除定时器
	KillTimer(m_IDTimer);	
}

BOOL CBMPMovieView::OnEraseBkgnd(CDC* pDC) 
{
	// 保存原来的图象刷子
	CBrush* pOldBrush = pDC->SelectObject(&m_BKBrush);
	
	//获得需要更新的剪裁区矩形
	CRect rect;
	pDC->GetClipBox(&rect);     
	
	pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),
		PATCOPY);
	pDC->SelectObject(pOldBrush);
	
	return TRUE;
}

⌨️ 快捷键说明

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