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