class CPractice7_2View : public CView
{
...
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CPractice7_2View)
...
afx_msg void OnAnimationStart();
afx_msg void OnAnimationStop();
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
static int bitmap_inc; // 애니메이션 카운터 증가변수
void ShowCharacter( );
int m_nBitmapMode;
};
int CPractice7_2View::bitmap_inc; // 애니메이션 카운터 증가변수
void CPractice7_2View::OnAnimationStart()
{
// TODO: Add your command handler code here
SetTimer(0, 200, NULL); // 타이머 설정
ShowCharacter(); // 비트맵을 0.2초마다 출력
}
void CPractice7_2View::OnAnimationStop()
{
// TODO: Add your command handler code here
KillTimer(0); // 타이머 해제
}
void CPractice7_2View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
// {
ShowCharacter(); // 비트맵을 0.2초마다 출력
// }
CView::OnTimer(nIDEvent);
}
void CPractice7_2View::ShowCharacter()
{
CClientDC dc(this); // 비트맵이 출력된 DC 생성
CDC memdc; // 메모리의 DC 생성
memdc.CreateCompatibleDC(&dc); // 호환성있는 메모리를 생성
// 리소스에서 비트맵 읽기
CBitmap bitmap, *oldbitmap, bitmapMask, bitmapBack;
bitmap.LoadBitmap(IDB_CHARACTER); // 캐릭터 비트맵
bitmapMask.LoadBitmap(IDB_CHARACTER_MASK); // 마스크 미트맵
bitmapBack.LoadBitmap(IDB_BACKGROUND); // 배경 비트맵
// 배경 출력
oldbitmap = memdc.SelectObject(&bitmapBack);
dc.BitBlt(0, 0, 256, 256, &memdc, 0, 0, SRCCOPY);
// 마스크 출력
memdc.SelectObject(&bitmapMask);
dc.BitBlt(80, 80, 90, 85, &memdc, 90*bitmap_inc, 0, SRCAND);
// 비트맵 출력
memdc.SelectObject(&bitmap);
dc.BitBlt(80, 80, 90, 85, &memdc, 90*bitmap_inc, 0, SRCPAINT);
// 애니메이션 카운터 증가시킴
bitmap_inc++;
if(bitmap_inc > 4)
bitmap_inc = 0;
// DC를 복원
memdc.SelectObject(oldbitmap);
}
참조 사이트: