본문 바로가기
프로그래밍/API

API-BitMap

by 리뷰하는 (게임)프로그래머_리프TV 2010. 4. 24.


비트맵을 사용하기 위한 예제,

#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("Bitmap");

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpszCmdParam, int nCmdShow )
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst = hInstance;

	WndClass.cbClsExtra = 0;
	WndClass.cbWndExtra = 0;
	WndClass.hbrBackground = (HBRUSH)GetStockObject( COLOR_WINDOW+1 );
	WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
	WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass( &WndClass );

	hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL );
	ShowWindow( hWnd, nCmdShow );

	while( GetMessage( &Message, NULL, 0, 0 ) )
	{
		TranslateMessage( &Message );
		DispatchMessage( &Message );
	}
	return (int)Message.wParam;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
	HDC hdc, MemDC;	// HDC를 2개를 두고 있다.
	PAINTSTRUCT ps;
	HBITMAP MyBitmap, OldBitmap;	// 비트맵 사용을 위한 변수

	switch( iMessage )
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint( hWnd, &ps );
		MemDC = CreateCompatibleDC( hdc );		// hdc에 대한 동일한 특성을 메모리에 만들어 MemDC에 저장.
		MyBitmap = LoadBitmap( g_hInst, MAKEINTRESOURCE( IDB_BITMAP1 ) );	// 비트맵을 로드해서 MyBitmap에 저장
		OldBitmap = (HBITMAP) SelectObject( MemDC, MyBitmap );	// MemDC에 비트맵 로드(그 후 oldBitmap에 백업)
		BitBlt( hdc, 0, 0, 48, 48, MemDC, 0, 0, SRCCOPY );	// 화면에 비트맵 출력
		SelectObject( MemDC, OldBitmap );	// MemDC는 다시 이전으로 되돌린다.
		DeleteObject( MyBitmap );	// MyBitmap 삭제
		DeleteDC( MemDC );		// 메모리 DC 삭제
		EndPaint( hWnd, &ps );
		return 0;
	}
	return( DefWindowProc( hWnd, iMessage, wParam, lParam));
}​



못보던 것들이 많지만,
비트맵을 화면에 뿌려주기 위해서는,
바로 뿌리는것이 아니라,
메모리DC를 만들고 그 안에 비트맵을 그려둔 후에, 화면 DC로 복사하여
화면에 그림이 나타나게 해야 한다. 이것만 파악 했다면 그렇게 어려운 예제는 아닌듯,
설명이 필요한 부분이

BitBlt( hdc, 0, 0, 48, 48, MemDC, 0, 0, SRCCOPY );	// 화면에 비트맵 출력​


이 부분이라고 생각하는데,
hdc(화면 DC)에 0, 0 의 좌표에 48, 48 크기 만큼, MemDC에 존재하는 0, 0부터 SRCCOPY 스타일로 가져 온다, 라고 생각하면 된다.
또 다른 설정값들

 값  설명
 BLACKNESS  대상영역을 검정색으로 가득 채운다 
 DSTINVERT  화면을 반전 시킨다.
 MERGECOPY  소스 비트맵과 대상 화면을 AND 연산한다.
 MERGEPAINT  소스 비트맵과 대상 화면을 OR 연산한다.
 SRCCOPY  소스 영역을 대상 영역에 복사한다.
 WHITENESS  대상영역을 흰색으로 채운다.


// 실행 화면

비트맵 이미지에 너무 마음두지 말자.

'프로그래밍 > API' 카테고리의 다른 글

API-Control(2)  (0) 2010.04.24
API-Control(1)  (0) 2010.04.24
API-RopMode  (0) 2010.04.24
API-GdiObject  (0) 2010.04.22
API-resource(3)  (0) 2010.04.21