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로 전송하고, 비트맵을 블록 단위로 전송하는 것은 아주 고속으로 수행되기 때문에 이렇게 하면 화면 깜박임 없이 깨끗하고 깔끔하게 출력 결과를 얻을 수 있게 되는 것이다.
간단한 도형을 출력하는 프로그램을 만들어 보도록 하자. 이 도형은 화면에 바로 그려진 것이 아니라, 메모리 비트맵에 그려진 후 비트맵 블록 전송을 이용해 화면에 출력된 것이다.
이렇게 간단한 그래픽을 출력할 때는 메모리 비트맵을 사용하는 것이 별 의미가 없지만, 메모리 비트맵을 사용하는 방법을 보이기 위해서 만든예제이다. 복잡한 그래픽을 출력할때 이 방법을 이용하면 그래픽 출력 성능이 확실히 좋아진다.
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
27 | MFC의 다각형 그리기 | pjk | 2014.05.24 | 16174 |
» | 메모리 비트맵 | pjk | 2014.05.24 | 4369 |
25 | Visual Studio MFC에서 디버깅용 콘솔 창 띄우기 | pjk | 2014.05.24 | 8424 |
24 | 쓰레드 동기화 기법 | pjk | 2014.05.24 | 4996 |
23 | 선의 스타일과 색상 및 굵기 지정방법 | pjk | 2014.05.24 | 4740 |
22 | PictureControl 크기 구하기 | pjk | 2014.05.24 | 4392 |
21 | 체크박스가 선택되어 있는지 확인하는 GetCheck() | pjk | 2014.05.24 | 7658 |
20 | DC(Device Context) | pjk | 2014.05.24 | 5100 |
19 | 키보드 입력을 처리하기 | pjk | 2014.05.24 | 5225 |
18 | 양끝이 평평한 pen(펜)의 굵기와 색깔 지정해서 선 그리기 | pjk | 2014.05.26 | 4471 |
17 | 원의 중심과 반지름을 이용한 원 그리기 | pjk | 2014.05.30 | 7220 |
16 | 세 점을 지나는 원 (3 Point Circle) | pjk | 2014.06.05 | 11303 |
15 | SetPixel() 을 사용하여 원을 그리기... | pjk | 2014.06.05 | 10566 |
14 | 두점을 지나고 반지름을 알고있을 때 원의 중심점을 찾기 | pjk | 2014.06.09 | 8979 |
13 | MFC 대화상자 종료 메시지 호출 순서 | pjk | 2014.06.19 | 5483 |
12 | FindFirstFile() | pjk | 2014.07.18 | 5815 |
11 | WinCE 디버그메시지 사용법(DEBUGMSG, RETAILMSG, ERRORMSG, NKDbgPrintfW) | pjk | 2014.07.21 | 5786 |
10 | 디렉토리(directory) 접근 C++ Win32 함수 총정리 | pjk | 2014.10.13 | 5035 |
9 | 윈도우 프로그래밍에서의 데이터 형 | pjk | 2014.10.13 | 5229 |
8 | WndProc | pjk | 2014.10.17 | 4058 |