SeeAlso) [레밍즈프로젝트], [레밍즈프로젝트/프로토타입], [(zeropage)MFC] = 참고 = MFC 기반의 코드이다. = 코드 = == 더블버퍼링 클래스 == {{{~cpp #pragma once class CmyDouBuffDC { private: CRect m_rt; CDC* m_pDC; CDC* m_pMemDC; CBitmap m_bmp; public: CmyDouBuffDC(CDC *pDC, CRect rt){ m_rt = rt; m_pDC = pDC; m_pMemDC = new CDC(); m_pMemDC->CreateCompatibleDC(m_pDC); m_bmp.CreateCompatibleBitmap(m_pDC, m_rt.Width(), m_rt.Height()); m_pMemDC->SelectObject(&m_bmp); m_pMemDC->Rectangle(0, 0, m_rt.Width(), m_rt.Height()); } ~CmyDouBuffDC(void){ m_pDC->BitBlt(0, 0, m_rt.Width(), m_rt.Height(), m_pMemDC, 0, 0, SRCCOPY); m_pMemDC->DeleteDC(); m_bmp.DeleteObject(); } CDC* getMemDC(){return m_pMemDC;} }; }}} == 사용 == Test는 OnDraw 상에서 하였다. OnDraw는 Invalidate를 통해서 OnPaint가 호출되면 자동으로 호출된다. OnDraw의 경우 도큐먼트 클래스와 연관 될 수 있다. {{{~cpp void CDoubleBufferingView::OnDraw(CDC* pDC) { CDoubleBufferingDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); //DoubleBuffering CRect rt; GetClientRect(&rt); CmyDouBuffDC *douDC = new CmyDouBuffDC(pDC, rt); //draw CDC *memdc = douDC->getMemDC(); memdc->Ellipse(this->pmBoundBall->x - mi_ballSize, this->pmBoundBall->y - mi_ballSize, this->pmBoundBall->x + mi_ballSize, this->pmBoundBall->y + mi_ballSize); //end DoubleBuffering delete douDC; } }}} = 코드설명 = == 생성자 == 화면 핸들러를 넘겨준다. 클래스 내부에는 윈도우 핸들이 없기 때문에 GetClientRect를 사용하지 못한다. 따라서 전달인자로 CRect가 전달된다. == 사용 == getMemDC()를 통해서 생성자를 통해 확보한 메모리DC 포인터를 전달받아 그림을 그린다. == 파괴자 == 그림을 뿌려주고 동적으로 생성된 메모리와 오브젝트들의 할당을 해제한다. = 용도 = 화면의 끊김을 없애기 위해서 사용될 것이다.