ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 더블 버퍼링 - MFC
    GUI/GDI 2008. 12. 25. 16:31
    void CMemDrawView::OnDraw(CDC* pDC)
    {
        CMemDrawDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        // TODO: add draw code for native data here
        // 화면 DC와 호환성 있는 메모리 DC를 만듦
        CDC BufferDC;
        BufferDC.CreateCompatibleDC(pDC);

        // 화면 DC와 호환성 있는 메모리 비트맵을 만듦
        CBitmap bmpBuffer;
        bmpBuffer.CreateCompatibleBitmap(pDC, 200, 200);

        // 메모리 DC에 메모리 비트맵을 선택
        CBitmap *pOldBitmap = (CBitmap *)BufferDC.SelectObject(&bmpBuffer);
       
        // 메모리 DC에 그림을 그림
        BufferDC.Rectangle(0, 0, 200, 200);
        BufferDC.Rectangle(10, 10, 100, 100);
        BufferDC.Ellipse(70, 70, 180, 180);

        // 메모리 비트맵에 그려진 내용을 화면으로 전송
        pDC->BitBlt(0, 0, 200, 200, &BufferDC, 0, 0, SRCCOPY);

        // DC 복원
        BufferDC.SelectObject(pOldBitmap);
    }


    void CAnimationView::DrawBitmap()
    {
        static int nAnimate;
        CClientDC dc(this);

        // 호환성 있는 메모리 DC를 생성
        CDC MemDC, BufferDC;
        BufferDC.CreateCompatibleDC(&dc);
        MemDC.CreateCompatibleDC(&dc);

        // 호환성 있는 메모리 비트맵 생성
        CBitmap bmpBuffer;
        bmpBuffer.CreateCompatibleBitmap(&dc, 32, 32);

        // 리소스에서 비트맵 읽기
        CBitmap bmpMask, bmpMan, bmpBack;
        bmpMask.LoadBitmap(IDB_MANMASK);
        bmpMan.LoadBitmap(IDB_MAN);
        bmpBack.LoadBitmap(IDB_BACK);

        // 메모리 비트맵 선택
        CBitmap *pOB1 = (CBitmap *)BufferDC.SelectObject(&bmpBuffer);

        // 배경 다시 그리기
        CBitmap *pOB2 = (CBitmap *)MemDC.SelectObject(&bmpBack);
        BufferDC.BitBlt(0, 0, 32, 32, &MemDC, 50, 50, SRCCOPY);

        // 마스크 그리기
        MemDC.SelectObject(&bmpMask);
        BufferDC.BitBlt(0, 0, 32, 32, &MemDC, 32*nAnimate, 0, SRCAND);

        // 아이콘 그림 그리기
        MemDC.SelectObject(&bmpMan);
        BufferDC.BitBlt(0, 0, 32, 32, &MemDC, 32*nAnimate, 0, SRCPAINT);

        // 메모리 비트맵에 그려진 내용을 화면으로 전송
        dc.BitBlt(50, 50, 32, 32, &BufferDC, 0, 0, SRCCOPY);

        // 애니메이션 카운터를 증가시킴
        if(++nAnimate > 3) nAnimate = 0;

        BufferDC.SelectObject(pOB1);
        MemDC.SelectObject(pOB2);
    }


    참조 사이트:

Designed by Tistory.