일반적으로 DC는 화면에 그래픽을 출력하기 위해 사용하지만, 프린터나 플로터 같은 출력 장치에 그래픽을 출력할 때
도 DC를 사용한다. 하지만 BitBIt함수를 이용하여 비트맵 블록을 전송하기 위해 화면 윈도우에서 얻어진 DC와 호환되는
메모리 DC를 사용하는 건 어떠한 출력 장치와도 연결되어 있지 않고, 순수히 메모리에 존재하는 DC이다.
메모리비트맵 - 화면에는 보이지 않고 메모리 상에만 존재 하는 비트맵
메모리 비트맵의 유용성
그래픽 데이터 저장
- 화면에서 얻어진 DC에 비트맵을 선택한 후 그림을 그리면 화면에도 그려지지만 비트맵에도 그려진다.
나중에 이 비트맵만 가지고 있으면, 이것을 다른 윈도우에 출력 할 수도 있고, 화면이 지워진 후에 이를 이용해 화면을 복원 할 수 도있다.
고속 그래픽 출력을 위한 버퍼
- 그림을 그리기 위해 그래픽을 함수를 호출하면 선과 원을 이용해 도형을 그린다고 하면 한장의 그림을 그리기 위해
여러번의 그래픽 함수가 호출되고 화면이 그려지는 과정이 드러나면서 화면이 깜빡거린다. 이런 경우에, 메모리 비트맵을 사용하면좋다. 메모리 DC를 만들고, 여기에 메모리 비트맵을 선택한다. 그런 다음 메모리 DC를 참조하여 여러가지 그래픽 작업을 수행하면 된다.
메모리 비트맵에는 그림이 그려지지만 아직까지 화면에 보이는 것은 아니다. 화면 구성이 끝나면, 메모리 비트맵블록을 화면의 DC로 전송한다. 비트맵을 블록 단위로 전송하는 것은 아주 고속으루 수행 되기 때문에, 깨끗한 출력 결과를 얻을수 있다.
CBitmap - 비트맵 데이터를 읽어오고 관리하는 기능을 한다.
CDC - 메모리 DC
CClientDC - 윈도우의 클라이언트 영역으로 한정되는 DC
윈도우즈는 비트맵을 곧바로 화면 DC로 출력하는 함수는 제공하지 않는다. 비트맵을 출력하는 함수라면 아마 다음과 같은 형태를 상상할 수 있을 것이다.
OutBitmap(hdc,x,y,비트맵 이름);
이런 함수가 있다면 무척 편리하게 비트맵을 출력할 수 있겠지만 안타깝게도 이런 함수는 없다. 왜냐하면 비트맵은 크기가 큰 데이터 덩어리이며 따라서 출력 속도가 형편없이 느리기 때문에 화면으로 곧바로 출력할 경우 여러 가지 꼴사나운 현상이 발생할 수 있기 때문이다. 게다가 다른 좋은 대안이 있기 때문에 직접 화면으로 출력하는 방법은 쓰지 않는다. 그 대안이 바로 여기서 논하고자 하는 메모리 DC이다.
메모리 DC란 화면 DC와 동일한 특성을 가지며 그 내부에 출력 표면을 가진 메모리 영역이다. 메모리에 있기는 하지만 화면 DC에서 사용할 수 있는 모든 출력을 메모리 DC에서도 할 수 있다. 선, 면, 원 등의 작도 함수는 물론 화면 DC에서는 불가능한 것까지도 가능하다. 그래서 메모리 DC에 먼저 그림을 그린 후 사용자 눈에 그려지는 과정은 보여주지 않고 메모리 DC에서 작업을 완료한 후 그 결과만 화면으로 고속 복사하는 방법을 많이 사용한다.
사용자 눈에 화면이 그려지는 과정을 보여주는 것은 그리 깔끔한 모양은 아니다. 여기서 우리가 하고자 하는 비트맵 출력을 위해서도 반드시 메모리 DC를 사용해야 한다. 비트맵도 일종의 GDI 오브젝트이지만 화면 DC에서는 선택할 수 없으며 메모리 DC만이 비트맵을 선택할 수 있다. 그래서 메모리 DC에서 먼저 비트맵을 읽어온 후 화면 DC로 복사하는 것이다. 메모리 DC를 만들 때는 다음 함수가 사용된다.
HDC CreateCompatibleDC( HDC hdc );
인수로 화면 DC의 핸들을 주면 이 화면 DC와 동일한 특성을 가지는 DC를 메모리에 만들어 그 핸들값을 리턴해 준다. 동일한 특성을 가진다(=호환된다)는 말은 사용하는 색상수, 색상면(plane)이 같다는 뜻이다. 호환되지 않는 DC끼리는 정보를 공유할 수 없기 때문에 화면 DC와 호환되는 메모리 DC를 만들어야 한다.
메모리 DC를 만든 후에는 비트맵을 읽어온 후 이 비트맵을 메모리 DC에 선택해 준다. 선택하는 방법은 여타의 GDI 오브젝트와 마찬가지로 SelectObject 함수를 사용하며 비트맵을 읽어올 때는 LoadBitmap 함수를 사용한다.
HBITMAP LoadBitmap( HINSTANCE hInstance, LPCTSTR lpBitmapName );
첫번째 인수는 비트맵 리소스를 가진 인스턴스의 핸들이며 두번째 인수는 비트맵 리소스의 이름이다. 읽어온 비트맵을 SelectObject 함수로 메모리 DC에 선택하면 메모리 DC의 표면에는 리소스에서 읽어온 비트맵이 그려져 있을 것이다.
이제 남은 일은 메모리 DC에 그려진 비트맵을 화면으로 복사하기만 하면 된다.
'API & MFC > MFC & COM' 카테고리의 다른 글
COM이론2장 (0) | 2010.03.13 |
---|---|
COM이론(Component Object Model) (0) | 2010.03.12 |
SDK와 MFC (0) | 2010.03.11 |
프로퍼티시트 적용&도움말 지우기 (0) | 2010.03.11 |
디버그모드 & 릴리즈모드 (0) | 2010.03.10 |