-
다이얼로그에서의 더블 버퍼링MFC 2010. 10. 15. 15:34
void CTestDlg::OnPaint()
{
SolidBrush bgBrush(Color(255,255,255)); // 흰색으로 초기화CPaintDC dc(this);
CBrush brhBack;
brhBack.CreateSolidBrush(RGB(255,255,255)); // 배경색CRect rlClientRect;
GetClientRect(rlClientRect);Rect rclClient(rlClientRect.left,rlClientRect.top,rlClientRect.Width(),rlClientRect.Height());
CBitmap bmp;
CBitmap* pOldBmp;
CDC memDC;bmp.CreateCompatibleBitmap(&dc, rlClientRect.right, rlClientRect.bottom);
memDC.CreateCompatibleDC(&dc);
pOldBmp = (CBitmap*)memDC.SelectObject(&bmp);Graphics mem(memDC.m_hDC);
mem.SetSmoothingMode(SmoothingModeHighQuality);
mem.SetTextRenderingHint(TextRenderingHintClearTypeGridFit);
mem.FillRectangle(&bgBrush,rclClient); // 배경을 흰색으로 지운다// 여기에서 그리고 싶은 내용을 그려준다
dc.BitBlt(0,0, rlClientRect.right, rlClientRect.bottom,&memDC, 0, 0, SRCCOPY);memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
}
참고로 다이얼로그 기반에서는 컨트롤이 안깜빡거리도록 하기 위해서 다이얼로그 -> Properties 에서
Clip Children 속성을 true로 해 줘야 한다.
//2012년 6월 20일 아래 내용 추가
1) CWinApp 헤더에 ULONG_PTR gdiplusToken; 추가
2) CWinApp c++의 InitInstance() 함수에 아래 내용 추가
여기서 주의할 점은 반드시 다이얼로그 DoModal() 앞에 넣어줘야함
GdiplusStartupInput gdiplusStartupInput;
if(::GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL) != Ok)
{
AfxMessageBox(_T("ERROR: Failed to initialize GDI+ library!"));
return FALSE;
}
3) 다이얼로그 클래스에서 아래 내용 추가
BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)
{
return true;
//return CDialog::OnEraseBkgnd(pDC);
}