BitBlt

¿øÇü BOOL BitBlt(HDC hDC,int X,int Y,int nWidth,int nHeignt, HDC hSrcDC,int XSrc,int ySrc,DWORD dwROP);
MFC ¿øÇü BOOL CDC::BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
Àμö

¢ºhDC:ºñÆ®¸ÊÀÌ º¹»çµÉ DC

¢ºX,Y,nWidth,nHeight:ºñÆ®¸ÊÀÌ º¹»çµÉ À§Ä¡ÀÇ Á»ó´Ü ÁÂÇ¥¿Í Æø, ³ÐÀÌ, ÀÌ °ªÀº ³í¸®Àû ÁÂÇ¥°ªÀÌ´Ù.

¢ºHSrcDC:º¹»çµÉ ºñÆ®¸ÊÀ» °¡Áö°í ÀÖ´Â DC. ¸¸¾à dwROP°¡ ¼Ò½º°¡ ÇÊ¿ä¾ø´Â °ªÀ̶ó¸é NULLÀÌ µÉ ¼öµµ ÀÖ´Ù.

¢ºXSrc,YSrc:º¹»çµÉ ºñÆ®¸ÊÀÇ ÁÂÃø »ó´Ü ÁÂÇ¥ÀÌ¸ç º¹»çó¿Í ¸¶Âù°¡Áö·Î ³í¸®Àû ÁÂÇ¥°ªÀÌ´Ù. ÀÌ °ªÀÌ 0ÀÏ °æ¿ì Àüü ºñÆ®¸ÊÀ» º¹»çÇÑ´Ù. º¹»ç¿øÀÇ Æø°ú ³ôÀÌ´Â º¹»çóÀÇ nWidth, nHeight°¡ Àû¿ëµÈ´Ù.

¢º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

¸®ÅÏ ÀÌ»ó¾øÀÌ ¼öÇàÇßÀ¸¸é 0ÀÌ ¾Æ´Ñ °ªÀ» ¸®ÅÏÇÏ°í ¿¡·¯°¡ ¹ß»ýÇßÀ» °æ¿ì 0À» ¸®ÅÏÇÑ´Ù.
¼³¸í

ÇϳªÀÇ DC¿¡ ÀÖ´Â ºñÆ®¸ÊÀ» ´Ù¸¥ DC·Î º¹»çÇÏ´Â ºñÆ®¸Ê Àü¼ÛÇÔ¼öÀÌ´Ù. À̶§ µÎ DC´Â ȣȯµÇ¾î¾ß Çϳª ¸¸¾à »ö»ó Æ÷¸ËÀÌ È£È¯µÇÁö ¾ÊÀ» °æ¿ì BitBlt´Â º¹»ç¿øÀÇ »ö»ó Æ÷¸ËÀ» º¹»çóÀÇ Æ÷¸ä¿¡ ¸Â°Ô º¯°æÇÑ´Ù. ºñÆ®¸ÊÀ» È­¸é¿¡ Ãâ·ÂÇϱâ À§Çؼ­´Â ¿ì¼± CreateCompatibleDCÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸Þ¸ð¸® DC¸¦ ¸¸µé¾î¾ß Çϸç SelectObject ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸Þ¸ð¸® DC¿¡ Ãâ·ÂÇÏ°íÀÚ ÇÏ´Â ºñÆ®¸ÊÀ» ¼±ÅÃÇÑ ÈÄ BitBlt·Î ½ÇÁ¦ È­¸é DC¿¡ Àü¼ÛÇÑ´Ù. À̶§ ºñÆ®¸ÊÀº ¿øº» ±×´ë·Î º¹»ç°¡ µÇÁö¸¸ ROPÄڵ忡 µû¶ó ¹è°æ°ú ÇÔ²² ³í¸® ¿¬»êµÇ¾î º¯ÇüµÉ ¼ö´Â ÀÖ´Ù. º¹»ç¿øÀÇ ºñÆ®¸ÊÀº º¹»çóÀÇ ¸ÉÇθðµå¿¡ µû¶ó Å©±â°¡ Ä¿Áö°Å³ª ÀÛ¾ÆÁö±âµµ ÇÑ´Ù. ¸ðµç ÀåÄ¡°¡ BitBlt¸¦ Áö¿øÇÏ´Â °ÍÀº ¾Æ´Ï¹Ç·Î GetDeviceCaps¸¦ »ç¿ëÇÏ¿© BitBlt¸¦ ¾µ ¼ö ÀÖ´Â ÀåÄ¡Àΰ¡¸¦ È®ÀÎÇØ º¸¾Æ¾ß ÇÑ´Ù.

¿¹Á¦ 1

ÀÌ ¿¹Á¦´Â ¸®¼Ò½º¿¡ Á¤ÀÇµÈ IDB_BITMAP ºñÆ®¸ÊÀ» È­¸éÀÇ 0,0¿¡ Ãâ·ÂÇÑ´Ù.

#include "resource.h"
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc,MemDC;
	PAINTSTRUCT ps;
	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;
		
		BitBlt(hdc, 0,0,bx,by,MemDC,0,0,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));
}
MemDC ¸Þ¸ð¸® DC¿¡ IDB_BITMAP1À» ¼±ÅÃÇØ ³õ°í hdc·Î ºñÆ®¸ÊÀ» Àü¼ÛÇÏ¿´´Ù. ºñÆ®¸ÊÀÇ Å©±â´Â GetObject ÇÔ¼ö·Î ±¸ÇÒ ¼ö ÀÖ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

ºñÆ®¸ÊÀ» Ãâ·ÂÇÏ´Â °úÁ¤ÀÌ ¹ø°Å·Ó´Ù¸é ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á ºñÆ®¸ÊÀ» °ð¹Ù·Î È­¸éÀ¸·Î Àü¼ÛÇÒ ¼öµµ ÀÖ´Ù.

void DrawBitmap(HDC hdc,int x,int y,HBITMAP hBit)
{
	HDC MemDC;
	HBITMAP OldBitmap;
	int bx,by;
	BITMAP bit;

	MemDC=CreateCompatibleDC(hdc);
	OldBitmap=(HBITMAP)SelectObject(MemDC, hBit);

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

	BitBlt(hdc,0,0,bx,by,MemDC,0,0,SRCCOPY);

	SelectObject(MemDC,OldBitmap);
	DeleteDC(MemDC);
}

hdcÀÇ (x,y)ÁÂÇ¥¿¡ hBit Àüü¸¦ Ãâ·ÂÇÑ´Ù.

¿¹Á¦ 2

BitBlt´Â °°Àº DC°£ÀÇ ºñÆ®¸Ê Àü¼Û¿¡¸¸ »ç¿ëµÇ´Â °ÍÀº ¾Æ´Ï¸ç °°Àº DC³¢¸®µµ ºñÆ®¸Ê Àü¼Û¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â È­¸é¿¡ ±×·ÁÁø µµÇüÀ» ¸¶¿ì½º ¹öÆ°À» ´©¸¥ À§Ä¡¿¡ º¹»çÇÑ´Ù.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		SelectObject(hdc,GetStockObject(LTGRAY_BRUSH));
		Ellipse(hdc,10,10,100,100);
		SelectObject(hdc,GetStockObject(GRAY_BRUSH));
		Rectangle(hdc,50,50,200,150);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_LBUTTONDOWN:
		hdc=GetDC(hWnd);
		BitBlt(hdc,LOWORD(lParam),HIWORD(lParam),100,100,hdc,40,40,SRCCOPY);
		ReleaseDC(hWnd,hdc);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_PAINT¿¡¼­ µµÇüÀ» Ãâ·ÂÇØ ³õ¾ÒÀ¸¸é ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸£¸é BitBlt·Î ÀÌ µµÇüÀ» Ŭ¸¯ÇÑ À§Ä¡¿¡ º¹»çÇÑ´Ù. À̶§ º¹»çó¿Í º¹»ç¿øÀº µÑ ´Ù hdcÀÌ´Ù. º¹»ç¿øÀº hdcÀÇ ÀÛ¾÷ ¿µ¿ª (40,40)¿¡ ÀÖ´Â ³ôÀÌ 100, ³ÐÀÌ 100ÀÇ ºñÆ®¸ÊÀÌ¸ç º¹»çó´Â °°Àº È­¸éÀÇ ¸¶¿ì½º·Î Ŭ¸¯µÈ À§Ä¡ÀÌ´Ù.

Âü°íÇÔ¼ö

PatBlt,LoadBitMap,StretchBlt

Ç÷¿Æû 95ÀÌ»ó
ÂüÁ¶ 6Àå ÂüÁ¶

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