-
GDI+를 이용한 더블 버퍼링MFC 2010. 7. 13. 18:11
지금까지 찾아본 GDI+ 더블 버퍼링 코드를 보면 거의 비슷한 내용이지만 구현하는 방법이 조금씩 달라서 도대체 어떤 것을 써야할지 헷갈리는 경우가 있다. 이럴 경우를 위해서 본인이 현재 쓰는 방법을 소개한다. 실제로, 더블 버퍼링 구현에는 여러가지 방법이 있으므로 참고만 하기 바란다. 앞으로 쓰여질 GDI+ 관련 내용도 아래에 있는 더블 버퍼링을 기준으로 설명할 것이다.
다음과 같은 순서로 구현한다
1. GDI+ 를 설정한다.
stdafx.h 에 아래 내용 추가
#include <GdiPlus.h>
#pragma comment(lib,"gdiplus")
using namespace Gdiplus;
DoubleBufferingTest.h 에 변수 추가
ULONG_PTR gdiplusToken;
DoubleBufferingTest.cpp 의 InitInstance()에 아래 내용 추가
GdiplusStartupInput gdiplusStartupInput;
if(::GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL) != Ok)
{
AfxMessageBox(_T("ERROR: Failed to initialize GDI+ library!"));
return FALSE;
}
DoubleBufferingTest.cpp의 ExitInstance()에 아래 내용 추가
::GdiplusShutdown(gdiplusToken);
2. OnEraseBkgnd()함수를 추가한다.
BOOL CDoubleBufferingView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
3. OnPaint()함수에 아래 내용을 추가한다
void CDoubleBufferingView::OnPaint()
{
CPaintDC dc(this);
CRect rlClientRect;
GetClientRect(&rlClientRect);Rect rclClient(rlClientRect.left,rlClientRect.top,rlClientRect.Width(),rlClientRect.Height());
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap memBitmap;
memBitmap.CreateCompatibleBitmap(&dc, rlClientRect.Width(),rlClientRect.Height());
CBitmap *pOldBitmap = MemDC.SelectObject(&memBitmap);
Graphics mem(MemDC.m_hDC);
mem.SetSmoothingMode(SmoothingModeHighQuality);
mem.FillRectangle(&bgBrush,rclClient); // 배경을 흰색으로 지운다
...
...
// 여기서부터 Graphics객체인 mem에 원하는 Drawing 작업을 한다.
...
...
dc.BitBlt(0,0, rlClientRect.right, rlClientRect.bottom,&MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBitmap);
mem.ReleaseHDC(dc.m_hDC);
}