SoftWare_API_MFC

[C++ / MFC] 더블 버퍼링 (double buffering)

건실한청년 2021. 2. 26. 16:40

화면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