StretchBlt

원형

BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);

인수

▶hDC:비트맵이 복사될 DC

▶X,Y,nWidth,nHeight:비트맵이 복사될 위치의 좌상단 좌표와 폭, 넓이, 이 값은 논리적 좌표값이다.

▶HSrcDC:복사될 비트맵을 가지고 있는 DC. 만약 dwROP가 소스가 필요없는 값이라면 NULL이 될 수도 있다.

▶nXOriginSrc,nYOriginSrc, nWidthSrc, nHeightSrc:복사될 비트맵의 좌측 상단 좌표와 크기. 이 영역의 크기와 복사처의 크기가 다를 경우 비트맵은 복사처의 크기에 맞게 축소되거나 확대된다.

▶dwROP:ROP코드, 즉 브러쉬와 복사원, 복사처의 비트맵 색상이 논리 연산될 방법을 지정한다. 모두 256개의 가능한 값이 있지만 실제로 의미를 갖는 없은 다음 15개이며 매크로 상수가 정의되어 있다. 이 외의 ROP코드가 필요할 경우에는 상수를 직접 사용해야 한다. 아래 표에서 S는 복사원 (Source), D는 복사처(Destination), P는 패턴(Pattern, 즉 브러쉬)를 의미한다.

매크로 상수 상수 연산식
BLACKNESS 0x00000042 0
DSTINVERT 0x00550009 ~D
MERGECOPY 0x00C000CA D&S
MERGEPAINT 0x00BB0226 ~S|D
NOTSRCCOPY 0x00330008 ~S
NOTSRCERASE 0x001100A6 ~(S|D)
PATCOPY 0x00F00021 P
PATINVERT 0x005A0049 P^D
PATPAINT 0x00FB0A09 P|~(S|D)
SRCAND 0x008800C6 S&D
SRCCOPY 0x00CC0020 S
SRCERASE 0x00440328 S&~D
SRCINVERT 0x00660046 S^D
SRCPAINT 0x00EE0086 S|D
WHITENESS 0x00FF0062 1

리턴 성공하면 nonzero, 에러 발생시 0을 리턴한다.
설명

DC간에 비트맵을 전송하여 복사한다. BitBlt와 동작하는 방식이 유사하나 단 복사원의 크기와 높이를 따로 지정할 수 있기 때문에 확대및 축소 복사할 수 있다. 20*40의 크기를 가지는 비트맵을 40*80영역에 복사하면 이 비트맵은 2배로 확대되며 10*20영역에 복사하면 절반으로 축소된다.

예제 1

다음 예제는 리소스에 정의된 IDB_BITMAP1을 두배로 확대하여 작업 영역에 출력한다.

#include "resource.h"
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	HDC MemDC;
	HBITMAP MyBitmap, OldBitmap;
	int bx,by;
	BITMAP bit;

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		MemDC=CreateCompatibleDC(hdc);
		MyBitmap=LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
		OldBitmap=(HBITMAP)SelectObject(MemDC, MyBitmap);

		GetObject(MyBitmap,sizeof(BITMAP),&bit);
		bx=bit.bmWidth;
		by=bit.bmHeight;

		StretchBlt(hdc,0,0,bx*2,by*2,MemDC,0,0,bx,by,SRCCOPY);

		SelectObject(MemDC,OldBitmap);
		DeleteObject(MyBitmap);
		DeleteDC(MemDC);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

비트맵의 크기 bx, by보다 두배 더 넓은 영역에 출력했으므로 비트맵은 두배로 확대된다.

다음 코드는 비트맵 영역의 절반 크기의 영역에 비트맵을 출력하므로 비트맵이 축소된다.

StretchBlt(hdc,0,0,bx/2,by/2,MemDC,0,0,bx,by,SRCCOPY);

비트맵을 축소할 때는 SetStretchBltMode 함수가 지정한 스트레칭 모드에 따라 획이나 열이 생략된다. 다음 코드는 비트맵을 반대로 뒤집는다.

StretchBlt(hdc,0,by,bx,-by,MemDC,0,0,bx,by,SRCCOPY);

복사원과 복사처의 크기 부호가 다르면 거울에 비친 것처럼 반사된 모양의 비트맵이 출력된다.

참고함수 BitBlt:비트맵을 확대하지 않고 출력한다.
플렛폼95이상
본문참조 

written by http://www.winapi.co.kr