2011년9월15일_winAPI_비트맵 리소스(임시제목)와 간단히 코드를 프로젝트에 추가하는 법



● 프로젝트에 관련 파일들을 불러오는 법

image  현재 워크스페이스(작업공간, 프로젝트)에는 어떤 파일도 존재하지 않는다.


image

메뉴 – Project – Add to Project - Files를 선택하면,

image

파일삽입 대화상자가 뜨고,

image

파일을 선택하고 OK버튼을 누르면,

image  image

이렇게 자동으로 분류되어 들어간다.
그런데 문제가 있다. 리소스파일이 소스파일폴더에 들어가 버렸다.
드래그하여 폴더를 옮기자.



● Bitmap예제

   1: //MsgProc.cpp
   2:  
   3: #include "MsgProc.h"
   4:  
   5:  
   6: LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
   7: {
   8:     HDC hdc,MemDC;    //hdc는 화면DC, MemDC는 메모리DC
   9:     PAINTSTRUCT ps;
  10:     HBITMAP MyBitmap, OldBitmap;    //비트맵오브젝트 핸들.
  11:     //add
  12:     BITMAP    bit;    //비트맵구조체변수선언
  13:     int        x,y;    //크기좌표
  14:  
  15:  
  16:     hdc = BeginPaint(hWnd, &ps);    //화면DC얻음.
  17:  
  18:     MemDC=CreateCompatibleDC(hdc);    //화면DC와 동일한 특성을 가진 메모리DC얻음.
  19:     //MyBitmap=LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));    //
  20:     MyBitmap=LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP2));    //비트맵 읽어옴.
  21:     OldBitmap=(HBITMAP)SelectObject(MemDC, MyBitmap);        //비트맵을 가리키는 오브젝트핸들로 교체.
  22:  
  23:     //add
  24:     GetObject(MyBitmap, sizeof(BITMAP), &bit);
  25:     x = bit.bmWidth;
  26:     y = bit.bmHeight;
  27:     
  28:     
  29:     //BitBlt(hdc, 0,0,x,y,MemDC,0,0,SRCCOPY);        //메모리DC -> 화면DC 복사하여 화면에 출력.
  30:     StretchBlt(hdc,0,0,x * 2 , y * 2,MemDC,0,0,x,y,SRCCOPY);
  31:     SelectObject(MemDC,OldBitmap);
  32:     DeleteObject(MyBitmap);
  33:     DeleteDC(MemDC);
  34:  
  35:     //------------------------------------------------------------------------------------------------
  36:     MemDC=CreateCompatibleDC(hdc);    //화면DC와 동일한 특성을 가진 메모리DC얻음.
  37:     //MyBitmap=LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));    //
  38:     MyBitmap=LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));    //비트맵 읽어옴.
  39:     OldBitmap=(HBITMAP)SelectObject(MemDC, MyBitmap);        //비트맵을 가리키는 오브젝트핸들로 교체.
  40:  
  41:     //add
  42:     GetObject(MyBitmap, sizeof(BITMAP), &bit);
  43:     x = bit.bmWidth;
  44:     y = bit.bmHeight;
  45:     
  46:     
  47:     //BitBlt(hdc, 0,0,x,y,MemDC,0,0,SRCCOPY);        //메모리DC -> 화면DC 복사하여 화면에 출력.
  48:     StretchBlt(hdc,0,0,x * 2, y * 2 ,MemDC,0,0,x,y,MERGECOPY);
  49:     SelectObject(MemDC,OldBitmap);
  50:     DeleteObject(MyBitmap);
  51:     DeleteDC(MemDC);
  52:  
  53:  
  54:     EndPaint(hWnd, &ps);
  55:  
  56:     return 0;
  57: }
  58:  
  59: LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
  60: {
  61:     PostQuitMessage(0);
  62:     return 0;
  63: }
  64:  


<실행결과>

image 

<소스코드분석>

  18:     MemDC=CreateCompatibleDC(hdc);    //화면DC와 동일한 특성을 가진 메모리DC얻음.

CreateCompatibleDC()의 인자로 화면DC의 핸들을 넣으면 동일한 특성을 가진 메모리DC의 핸들을 반환한다.
비트맵은 화면DC로 바로 화면에 출력이 불가능하므로 메모리DC를 생성하여 그린 후 나중에 복사한다.
이 함수의 원형은 다음과 같다.

HDC CreateCompatibleDC(HDC hdc);

 

  19:     //MyBitmap=LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));    //
  20:     MyBitmap=LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP2));    //비트맵 읽어옴.


image image

MAKEINTRESOURCE() 매크로함수는 쉽게 설명하자면 상기와 같이 정수값을 문자형포인터 타입으로 캐스팅한다.
(과거에는 리소스의 ID를 “MyMenu”와 같이 문자열을 사용했으나 기계는 숫자를 다루기 편하기 때문에...(생략))
g_hInst는 WinMain()시작부에 현재 실행 중인 이 프로그램의 인스턴스핸들을 대입하니 그것을 가지고 있다.
즉, 비트맵리소스를 불러와 현재 프로그램에 적재하는 함수이다.
리소스는 실행파일과 분리되어 있어 프로그램실행시 메모리에 로딩되지 않는다.
그러니 실행 중에 로딩하는 것.
LoadBitmap()의 원형은 다음과 같다.

HBITMAP LoadBitmap(HINSTANCE hInstance,         // 인스턴스의 핸들
                           LPCTSTR lpBitmapName);       // 비트맵리소스의 ID


GetModuleHandle()는 MSDN 에 의하면 GetModuleHandlle은 모듈의엔트리 포인트를 넘겨주는 함수이다.

[출처] GetModuleHandle 과 LoadLibrary|작성자 야구광

헉 출처남네..한 줄 복사는 참아주삼 ㅠㅠ

NULL을 인자로 넘기면 현재 실행 중인 모듈의 엔트리포인트를 반환한다. (모듈 = 함수 = 코드 = 프로그램?)
윈도우즈는 여러 개의 프로그램이 동시에 실행되는 멀티 태스킹 시스템에 하나의 프로그램이 여러 번 실행될 수도 있다.
그래서 WinMain()호출시 인자로 HINSTANCE타입의 hInstance(인스턴스 핸들)을 받아 프로그램이 자신을 알게 된다.
(동사무소에서(운영체제로부터) 주민증(인스턴스핸들)를 받는 것과 같은가? 인생이 끝나면 소멸되니..)

//잠시 그만하고 도서관리할래 ㅠㅠ




● DrawBitmap예제

관련 주요 소스코드만 아래에 삽입..

   1: //MsgProc.cpp
   2:  
   3: #include "MsgProc.h"
   4:  
   5:  
   6: HDC hdc;
   7: PAINTSTRUCT ps;
   8: static HBITMAP MyBitmap1;
   9: static HBITMAP MyBitmap2;
  10:  
  11: LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
  12: {
  13:     MyBitmap1=LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
  14:     MyBitmap2=LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP2));
  15:  
  16:     return 0;
  17: }
  18:  
  19: LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
  20: {
  21:  
  22:     return 0;
  23: }
  24:  
  25: LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
  26: {
  27:  
  28:     return 0;
  29: }
  30:  
  31: LRESULT OnRButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
  32: {
  33:  
  34:     return 0;
  35: }
  36:  
  37:  
  38: LRESULT OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
  39: {
  40:  
  41:     return 0;
  42: }
  43:  
  44: LRESULT OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
  45: {
  46:  
  47:     return 0;
  48: }
  49:  
  50: LRESULT OnLButtonDBLCLK(HWND hWnd, WPARAM wParam, LPARAM lParam)
  51: {
  52:  
  53:     return 0;
  54: }
  55:  
  56:  
  57: LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
  58: {
  59:  
  60:  
  61:     hdc = BeginPaint(hWnd, &ps);
  62:     DrawBitmap(hdc,10,10,MyBitmap1);
  63:     DrawBitmap(hdc,10,10,MyBitmap2);
  64:     EndPaint(hWnd, &ps);
  65:  
  66:     return 0;
  67: }
  68:  
  69: LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
  70: {
  71:     DeleteObject(MyBitmap1);
  72:     PostQuitMessage(0);
  73:     return 0;
  74: }
  75:  
  76: void DrawBitmap(HDC hdc,int x,int y,HBITMAP hBit)
  77: {
  78:     HDC MemDC;
  79:     HBITMAP OldBitmap;
  80:     int bx,by;
  81:     BITMAP bit;
  82:  
  83:     MemDC=CreateCompatibleDC(hdc);
  84:     OldBitmap=(HBITMAP)SelectObject(MemDC, hBit);
  85:  
  86:     GetObject(hBit,sizeof(BITMAP),&bit);
  87:     bx=bit.bmWidth;
  88:     by=bit.bmHeight;
  89:  
  90:     BitBlt(hdc,x,y,bx,by,MemDC,0,0,SRCCOPY);
  91:  
  92:     SelectObject(MemDC,OldBitmap);
  93:     DeleteDC(MemDC);
  94: }


<실행결과>

image 


<소스코드분석>

//내일 해야지~







참조(Reference)



책 ”windows API 정복“
p.176 – 6-3 비트맵
p.177 – 예제 Bitmap
p.178 – 6-3-나. 메모리DC
p.180 – 6-3-다. BitBlt
          6-3-라. StretchBlt
p.182 – 예제 DrawBitmap


DSCN4360 DSCN4361 DSCN4362 DSCN4363