본문 바로가기

Programming/VC++

[API] 리소스 추가하기...인가?

6-4-가. bitmap.dsw

점, 선, 원 등을 그리는 작도 함수를 사용하면 어떤 그래픽이든지 그릴 수 있다. 사실 극단적으로 말하자면 점을 찍는 SetPixel만 사용해도 못그릴 그림이 없는 셈이다. 그러나 작도로 그리는 그래픽은 그 속도는 둘째로 치더라도 복잡한 그림을 나타내기에는 무리가 많다. 특히 사진같은 정밀한 그래픽을 프로그램 실행중에 일일이 그린다는 것은 굉장히 비합리적이다. 다음과 같은 그림을 작도 함수로 직접 그린다고 생각해 보라. 과연 가능하겠는가?

그래서 복잡한 그림을 출력해야 할 경우는 미리 그려진 비트맵을 사용한다. 페인팅 툴을 사용해 출력하고자 하는 그림을 미리 그려 두거나 아니면 스케너와 같은 장비로 그림을 입력받아 두고 프로그램에서는 이 그림을 사용하는 것이 일반적이다. 복잡한 그림을 출력하는 용도 외에도 비트맵은 넓은 활용 범위를 가지고 있다. 화면의 일정영역을 복사해서 옮기기도 하고 잠시 보관해 두기도 하며 화려한 애니메이션에 활용되기도 한다.

그럼 일단 비트맵을 읽어와 화면으로 출력하는 프로그램을 한번 만들어 보자. 리소스를 임포트하는 생소한 실습을 해야 하므로 단계를 따라 프로젝트를 만들어 보자.

1Bitmap.dsw 프로젝트를 만들고 ApiStart.txt를 복사하여 Bitmap.cpp를 만든 후 프로젝트에 포함시킨다. 일단 Bitmap.cpp의 lpszClass만 "Bitmap"으로 변경시키고 컴파일해 보자. 그러면 First.exe와 같은 실행 파일이 만들어질 것이다.

2비트맵 출력에 사용될 실습용 비트맵을 준비한다. 아무 비트맵이나 상관없지만 여기서는 윈도우즈 3.1에 포함되어 있는 Arches.bmp 파일을 사용한다. 사정에 따라 아무 비트맵이나 사용해도 상관없다. 단 그래픽 카드에는 맞아야 하므로 16색상 비트맵을 준비하는 것이 좋을 것 같다. 준비한 비트맵 파일을 Bitmap 프로젝트 디렉토리에 복사해 둔다.

3비트맵 리소스를 만든다. 비트맵 편집기를 사용할 경우 직접 비트맵을 만들 수도 있지만 여기서는 이미 만들어져 있는 비트맵을 임포트(Import)해와 사용할 것이다. 임포트란 남이 만들어 놓은 리소스를 영원히 빌려오는 동작이다. Insert/Resource를 선택하면 다음 대화상자가 나타난다.

이 대화상자에서 리소스 타입을 선택하면 새로운 리소스를 만드는 것이므로 그렇게 하지말고 Import 버튼을 누른다. 그러면 다음과 같은 임포트 대화상자가 나타날 것이다.

이 대화상자에서 미리 준비해 두었던 비트맵 파일을 선택한다. 그러면 이 비트맵을 IDB_BITMAP1이라는 ID로 임포트해오며 Script1.rc라는 리소스 스크립트 파일을 만들어 줄 것이다.

이 스크립트 파일을 Bitmap.rc로 저장하고 Project/Add To Project/Files메뉴 항목을 사용하여 프로젝트에 포함시킨다. 비트맵 파일을 임포트하고 리소스 파일을 만든 것이다. 만약 직접 비트맵을 만드려면 Insert/Resource 메뉴에서 Bitmap을 선택한 후 New 버튼을 눌러 새 비트맵을 그리면 된다.

4비트맵 리소스를 읽어와 출력하도록 코드를 수정한다.

#include "resource.h"
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc,MemDC;
	PAINTSTRUCT ps;
	HBITMAP MyBitmap, OldBitmap;
	switch(iMessage) {
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		MemDC=CreateCompatibleDC(hdc);
		MyBitmap=LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
		OldBitmap=(HBITMAP)SelectObject(MemDC, MyBitmap);
		BitBlt(hdc, 0,0,123,160,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));
}

리소스를 만들었으므로 resource.h를 포함시켜 주어야 한다. 일단 실행 결과를 보이면 다음과 같다.

(0,0)위치에 비트맵이 출력되었다. 코드를 보면 다소 생소한 함수들이 사용되고 있는데 이 코드의 의미는 잠시 후에 알아보자.


목록 보기  다음 강좌            written by http://www.winapi.co.kr

'Programming > VC++' 카테고리의 다른 글

[VC++] VISUAL ASSIST X 레지스트리 수정  (0) 2007.08.01
[C] sqrt를 사용한 거리 구하기  (0) 2007.07.31
[C] math.h의 pow함수  (0) 2007.07.31
[C] sqrt() 쓰는 법  (0) 2007.07.31
[C] 좌표값 구하기  (0) 2007.07.31