GUI/GDI

Animation - MFC

jjryu 2008. 12. 10. 01:37
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);
}


참조 사이트: