본문 바로가기

Programming/Win32&MFC&COM

메모리DC를 이용한 더블버퍼링으로 그리기

반응형

일반적으로 비트맵을 화면에 출력할 때는 더블 버퍼링이라는 방법을 사용합니다.

출력을 할 때 바로 화면에 출력하는 것이 아닌 메모리에 먼저 그리고 그려진 내용을 화면에 출력하는 것입니다.

이 방법을 사용하면 그림을 그릴 때 깜빡거리는 현상을 줄일 수 있습니다.

계속 화면에 출력하는 것보다 메모리에 다 그리고 그려진 내용을 화면에 한 번에 출력하기 때문입니다.

보통 비트맵을 이렇게 그리지만, 그래프 등 출력이 많이 발생하는 경우에 활용이 가능합니다.

비트맵이 아닌 일반 선, 도형 등을 더블 버퍼링을 이용해서 출력하는 방법을 설명하도록 하겠습니다.

기준은 MFC 기준이고, Win32 API 기반에서도 충분히 활용이 가능합니다.

OnPaint()에서 적용하는 방법입니다.

WM_PAINT 처리 함수인 OnPaint() 함수를 정의합니다.

기본적으로 다이얼로그 기반은 OnPaint가 이미 정의되어 있습니다.

그리고 기본적으로 CPaintDC dc(this) 코드가 존재합니다.

이 dc를 활용해서 그려주면 됩니다.

일단은 이 CPaintDC를 사용하기 위해서 if 문 바깥으로 빼줍니다.

그리고나서 내가 그릴 부분을 그리면 됩니다.

//메모리 DC를 생성합니다.
CDC memDC;
//그래프나 도형을 그릴 Bitmap을 생성합니다. (도화지 정도로 보시면 될 거 같습니다.)
CBitmap bmp, *pOldbmp;
//메모리 DC를 위의 CPaintDC인 dc에 호환되게 만들어 줍니다.
memDC.CreateCompatibleDC(&dc);
//주어진 dc에 호환하는 비트맵을 생성합니다.
bmp.CreateCompatibleBitmap(&dc, 작성할 비트맵 가로 사이즈(픽셀), 작성할 비트맵 세로 사이즈(픽셀));
//이제 memDC에 생성된 비트맵을 연결 시켜줍니다.
pOldbmp = memDC.SelectObject(&bmp);

이렇게 하고 그리고 싶은 것을 memDC에 그려주면 됩니다.

memDC.Rectangle(영역); 이런식으로 필요한 도형, 선 등을 그리면 됩니다.

그리고나서 dc에 memDC를 출력하면 됩니다.

dc.StretchBlt() API를 사용하면 되며 BitBlt()를 사용해서도 동일하게 가능합니다.

사용법은 아래 MSDN의 내용을 참고하시면 됩니다.

https://msdn.microsoft.com/en-us/library/3k5s37a5.aspx

그리고 마지막은 사용한 object와 메모리 dc의 메모리 할당을 해제해주면 끝입니다.

memDC.SelectObject(pOldbmp);
bmp.DeleteObject();
memDC.DeleteDC();

그럼 화면에 깜빡임이 없이 출력되는 것을 볼 수 있을 것입니다.

반응형