U E D R , A S I H C RSS

레밍즈프로젝트/프로토타입/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 포인터를 전달받아 그림을 그린다.

파괴자

그림을 뿌려주고 동적으로 생성된 메모리와 오브젝트들의 할당을 해제한다.

용도

화면의 끊김을 없애기 위해서 사용될 것이다.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:22
Processing time 0.0125 sec