API-비트맵3(비트맵 확대/축소)
- 프로그래밍/WindowsAPI
- 2011. 5. 13. 12:22
1.StretchBlt 함수
다음 함수도 DC 간에 비트맵을 전송하는데 확대 및 축소가 가능하다는 점이 다르다.
BOOL StretchBlt ( HDC hdcDest , int nXOriginDest , int nYOriginDest , int nWidthDest , int nHeightDest, HDC hdcSrc , int nXOriginSrc , int nYOriginSrc , int nWidthSrc , int nHeightSrc , DWORD dwRop );
인수를 보면 복사 대상과 복사원이 모두 폭과 높이를 가지고 있다.
복사원의 지정한 영역이 복사대상의 지정한 영역의 크기만큼 확대되어 출력되며
복사대상의 영역이 복사원보다 더 좁다면 축소가 발생할 것이다.
이에 비해 BitBlt 은 대상에 대해서만 폭과 높이를 지정할 수 있으므로 확대나 축소는 할 수 없다.
예제의 BitBlt (빗블릿) 호출문을 다음과 같이 변경해 본다.
StretchBlt ( hdc , 50, 50, 800, 600, MemDC, 0, 0, 300, 300, SRCCOPY );
이 코드에서는 300,300 폭을 가지는 영역을 50, 50, 800, 600 RECT 영역에 복사했으므로 비트맵이 확장되서 출력됨
[프로그래밍/WindowsAPI] - API-BitBlt, PatBlt,StretchBlt,TransparentBlt 정리
[ StretchBlt 로 확대,축소할 수 있다 ]
Bitmap 예제는 비트맵을 출력하는 기본적인 방법과 절차에 대해서는 잘 설명하고 있지만 몇 가지 문제점이 있다.
비트맵을 읽어서 출력하고 정리하는 일련의 코드를 보이기 위해 WM_PAINT 안에 모든 코드를 작성해 넣었는데 이런 코드는 예제 수준에서나 사용할 수 있는 것이지 실무에서는 굉장히 비효율 적이다.
WM_PAINT 메시지는 그리기를 할 때마다 전달 되는데 이때마다 비트맵을 읽어와서 출력/해제 하는 것을 반복하면 속도가 늦어진다.
원칙적으로 비트맵은 WM_CREATE 에서 미리 읽어두고 WM_PAINT 에서는 출력만 해야 한다.
물론 츠로그램이 종료되기 전인 WM_DESTROY 에서는 해제해야 할 것이다.
또다른 문제점은 비트맵을 출력하기가 너무 번거롭다는 점인데
비트맵 하나를 출력할 때마다 메모리 DC 를 만들고 선택/해제 하는 과정을 일일이 거쳐야 한다.
그래서 비트맵을 좀 더 간단하게 출력할 수 있는 래퍼 함수를 만들어서 사용해 보자.
다음 예제의 DrawBitmap 함수는 hdc 의 주어진 좌표에 MyBitmap 을 출력한다.
DrawBitmap 함수 안에 Bitmap 예제의 WM_PAINT 에 있던 코드가 그대로 작성되어 있으며 이외에 비트맵의 크기를 조사하는 GetObject 함수문이 추가되어 전달된 비트맵의 크기를 자동으로 조사해서 비트맵 전체를 출력한다.
GetObject 는 핸들로부터 펜, 브러시 , 비트맵 등의 GDI 오브젝트 정보를 조사하는 함수인데 BITMAP 구조체의 bmWidth, bmHeight 멤버를 읽으면 비트맵 크기를 구할 수 있다.
앞에서 비트맵 출력 방법을 소개할 때 효율상의 문제로인해 비트맵을 직접 출력하는 함수를 제공하지 않는다고 했는데 이제 와서 이런 함수를 소개하는 이유는 요즘에는 그만큼 하드웨어 환경이 좋아졌다는 이야기다. ( 별 문제가 되지 않는다 ) CPU 의 속도가 빨라진 것도 한 이유이지만 요즘 출시되는 그래픽 카드의 대부분이 비트맵 출력을 하드웨어적으로 처리하는 가속기능을 제공하기 때문이다.
때문에 , 간단한 게임류 정도에서는 DrawBitmap 정도의 함수를 사용해도 별 문제가 없다. 비트맵 출력 절차중 가장 느린 함수는 LoadBitmap 이므로 이 함수만 미리 호출해 놓으면 된다. |
이 글을 공유하기