본문 바로가기

app/C

MFC 더블 버퍼링

-_-요즘에 프로젝트 하느라고 포스팅을 못했떠니..ㅎ
어쩄든 프로젝트에서 그리는걸 수행해야하는데..-0- 어쩝 이리 깜박거릴까.ㅎ
당연히 정답은 더블버퍼링(근데 이걸 메모리DC라고도 하나보네..)


짜잉나서 OnPaint 함수를 통째로 써버렸다..ㅋㅋ 
2008에선 다이얼로그로 프로그램시 기초적으로 코딩이 된 부분이 많아서 어지럽기도 한데
더블버퍼링 써저있는 곳부터 사용하시면 된다.


void CschoolzoneDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 아이콘을 그립니다.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}


//더블 버퍼링 //
CClientDC dc(this); //윈도우 DC를 얻는다.
CDC MemDC;         //메모리 DC를 만듬.
CBitmap bitmap;
CBitmap *pOldBitmap;

MemDC.CreateCompatibleDC(&dc); // 윈도우DC와 메모리 DC호환.
bitmap.LoadBitmap(IDB_BITMAP1);//비트맵을 읽어 들임.
pOldBitmap = (CBitmap *)MemDC.SelectObject(&bitmap);//비트맵을 DC에 선택


//mapdivision(&MemDC);

dc.BitBlt(0, 0, 620, 620, &MemDC, 0, 0, SRCCOPY);//비트맵을 해당위치에 그려줌.
MemDC.SelectObject(pOldBitmap);//DC복원

}

나도 네이년이랑 구글 돌아다니면서 글어온거라..-0-;; 너무 많이 봐서 출처를 모르겠다. (다 하고 보니 창을 껏네.. 혹시나 누가 되신다면 댓글 달아주세요 삭제해드릴께요)

뭐 더블 버퍼링이 어떤 형식인지는 아실테고 난 좀더 쏘스를 함수화를 시켰다.
지금 이건 BITMAP을 읽고 뿌려주는건데 나머진
(BITMAP의 경우 리소스에서 원하는 비트맵을 추가만 해주면 된다.)
아랫쪽에 주석되어 있는 함수 mapdivision(CDC* memDC) 에 CDC 포인터를 받아서 
해당 함수에서 CDC로 그리는걸 추가한다음 DC로 그리게 만들었다.

결국 쏘스만 본따서 원하는 함수만 만들어주고 나 처럼 할려면 함수에 CDC포인터만 받고서 그리면 된다.
포인터로 받기 때문에 리턴도 필요없고, 함수가 끝나면 DC에서 그려주는 원리이다. 

흠....-_-알아서 잘 쓰시길..(사실 찾아보면 자료는 많은데 왜 난 사용을 못하지?ㅋㅋ 아직 멀었나 보다.)