한국어
Windows Programming
 

메모리 비트맵

pjk 2014.05.24 12:09 조회 수 : 3978

CClientDC dc(this); //Main buffer
 CDC dcMem;     //Sub buffer
 CBitmap m_Bitmap, *m_pOldBitmap;   // memory DC 의 DeviceContext 호환과 DC의 크기를 결정하기 위한 비트맵

 

 CFont font,*pOldFont;    // 폰트 
 CString str;      // 출력할 텍스트
 
 m_Bitmap.CreateCompatibleBitmap(&dc,  856, 321 ); // 비트맵 생성 (창크기)
 dcMem.CreateCompatibleDC(&dc);

 m_pOldBitmap = (CBitmap *)dcMem.SelectObject(m_Bitmap);
 

dcMem.FillSolidRect(0, 0, nBMP_Width, nBMP_High, GetSysColor(COLOR_3DFACE)); // 기본 배경값 검은색을 기본 윈도우시스템색으로 변경
//dcMem.FillSolidRect(0, 0, 856, 320, RGB(255, 255, 255)); //(기본 배경값 검은색을 흰색으로 변경)

 //선 그리기
 dcMem.MoveTO( 100, 100); //시작점 
 dcMem.LineTO( 200, 200); //끝점 (라인생성  ->  dcMem buffer )

 

 //font.CreatePointFont(20, _T("굴림체"));
 font.CreateFont( 14, 0, 0,0, 1000,0,0,0,0, OUT_DEFAULT_PRECIS, 0 ,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE, _T("굴림체") ); 
 pOldFont=(CFont*)dcMem.SelectObject(&font);

 

 str.Format("Text");   // 텍스트
 dcMem.TextOut(100, 100, str); 

  
 dc.BitBlt(14,222,870,542, &dcMem,0,0,SRCCOPY); //dcMem에 그렸던걸 최종적으로 Main buffer(dc)에 그리기.
 
 //buffer delete
 DeleteObject(dc.SelectObject(GetStockObject(BLACK_PEN)));
 DeleteObject(dcMem.SelectObject(GetStockObject(BLACK_PEN)));
 dcMem.DeleteDC();

한 장의 그림을 그리는데 여러 가지 그래픽 함수를 호출해야 하는 경우가 있다. 예를 들면 선과 원을 여러개 조합하여 도형을 그린다든가 AND연산과 OR연산을 이용하여 배경면, 움직이는 물체의 비트맵을 합성한다든가 하는 일을 할 때는 한장의 그림을 그리기 위해 여러 번의 그래픽 함수를 호출해야 한다.

이런 경우 화면에 바로 출력을 하면 화면이 그려지는 과정이 드러나면서 화면이 깜박거려 보일 수가 있다. 즉 한장의 그림을 만들기 위해 호출되는 여러 개의 그래픽 함수가 각각수행되는 모습이 눈에 보여서, 화면이 난잡해 보이게 되는 것이다.

이런 경우에는 바로 화면에 출력하는 것보다는 메모리 비트맵을 이용하는 것이 좋다. 일단 메모리 DC를 만들고 여기에 메모리 비트맵을 선택한다.
그런 다음 이 메모리 DC를 참조하여 여러 그래픽 작업을 수행하여 원하는 그림을 완성한다.메모리 비트맵에는 그림이 그려지지만 아직까지 화면에 보이는 것은 아니다. 화면 구성이 끝나면 메모리 비트맵 블록을 화면의 DC로 전송하고, 비트맵을 블록 단위로 전송하는 것은 아주 고속으로 수행되기 때문에 이렇게 하면 화면 깜박임 없이 깨끗하고 깔끔하게 출력 결과를 얻을 수 있게 되는 것이다.

간단한 도형을 출력하는 프로그램을 만들어 보도록 하자. 이 도형은 화면에 바로 그려진 것이 아니라, 메모리 비트맵에 그려진 후 비트맵 블록 전송을 이용해 화면에 출력된 것이다.

이렇게 간단한 그래픽을 출력할 때는 메모리 비트맵을 사용하는 것이 별 의미가 없지만, 메모리 비트맵을 사용하는 방법을 보이기 위해서 만든예제이다. 복잡한 그래픽을 출력할때 이 방법을 이용하면 그래픽 출력 성능이 확실히 좋아진다.