[C++ / MFC] 더블 버퍼링 (double buffering)
화면DC에 바로 그림을 그릴 경우 화면이 깜빡이는 현상이 발생하는데
그 현상을 해결하기 위해 메모리DC를 만들고
그 메모리DC에 그림을 그린 후 화면DC로 한번에 복사하는 것을 더블 버퍼링 이라고 한다.
더블 버퍼링을 사용하지 않는 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
void CDCDraw::NotDoubleBuffering(void) { CWnd* pWnd = NULL; pWnd = GetDlgItem(IDC_ST_PICTURE); CDC *pDCc = pWnd->GetDC();
CRect rect; pWnd->GetClientRect(&rect);
CPen *pOldPen = NULL; CBrush *pOldBrush = NULL;
CPen penWhite(PS_SOLID, 1, RGB(255, 255, 255)); CBrush brushWhite(RGB(255, 255, 255));
pOldPen = pDCc->SelectObject(&penWhite); pOldBrush = pDCc->SelectObject(&brushWhite);
pDCc->Rectangle(0, 0, rect.right, rect.bottom);
pDCc->SelectObject(pOldPen); pDCc->SelectObject(pOldBrush);
pWnd->ReleaseDC(pDCc); } |
더블 버퍼링을 사용한 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
void CDCDraw::DoubleBuffering(void) { CWnd* pWnd = NULL; pWnd = GetDlgItem(IDC_ST_PICTURE); CDC *pDCc = pWnd->GetDC();
CRect rect; pWnd->GetClientRect(&rect);
CDC memDC; CBitmap *pOldBitmap, bitmap;
memDC.CreateCompatibleDC(pDCc); bitmap.CreateCompatibleBitmap(pDCc, rect.right, rect.bottom); pOldBitmap = memDC.SelectObject(&bitmap);
CPen *pOldPen = NULL; CBrush *pOldBrush = NULL;
CPen penWhite(PS_SOLID, 1, RGB(255, 255, 255)); CBrush brushWhite(RGB(255, 255, 255));
pOldPen = memDC.SelectObject(&penWhite); pOldBrush = memDC.SelectObject(&brushWhite);
memDC.Rectangle(0, 0, rect.right, rect.bottom);
memDC.SelectObject(pOldPen); memDC.SelectObject(pOldBrush);
pDCc->BitBlt(0, 0, rect.right, rect.bottom, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);
bitmap.DeleteObject(); memDC.DeleteDC();
pWnd->ReleaseDC(pDCc); } |
NEATFISH - programming » [C++ / MFC] 더블 버퍼링 (double buffering) (cafe24.com)
NEATFISH - programming » [C++ / MFC] 더블 버퍼링 (double buffering)
화면DC에 바로 그림을 그릴 경우 화면이 깜빡이는 현상이 발생하는데 그 현상을 해결하기 위해 메모리DC를 만들고 그 메모리DC에 그림을 그린 후 화면DC로 한번에 복사하는 것을 더블 버퍼링 이
neatfish.cafe24.com