[API] API :: 주석 설명 설명

simpled 2013.06.23 15:13 조회 수 : 6005

API 수업 첫번째 자료.pptx


/* Project 폴더 안에 있는 해더파일이며, 메인코딩 파일에서 제외시킨 체, <windows.h>를 인클루드 시켜도 됩니다. */  

#include "stdafx.h"

 

/* #progma once로 해당 소스가 단 한번만 포함되게 한다.  #include "resource.h"를 포함시킨다. */  

#include "2011.03.15 (1).h"

 

/* 전역변수의 문자열 길이를 지정해 준다. */  

#define MAX_LOADSTRING 100

 

/* Handle-Instance : 현재 창을 띄우려는 인스턴스의 핸들값을 갖는다. */  

HINSTANCE hInst;

 

/* 인스턴스의, 제목 표시줄 문자열 길이를 초기화한다. */  

TCHAR szTitle[MAX_LOADSTRING];

 

/* 인스턴스의, 클래스 이름 길이를 문자열로 초기화한다. */  

TCHAR szWindowClass[MAX_LOADSTRING];

 

 /* 사용자 정의 함수이며, 원형 함수라고 부른다. */  

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

 

/* 

   멀티바이트 문자 집합은 Winmain이며 유니코드 문자 집합은 wWinmain을 사용해야 한다. 

   순서 : 프로젝트 - 속성 - 구성속성 - 일반 - 문자집합 - [설정]

   그리고... 오래되서 정확한 정보인지는 모르겠지만, '유니코드일 때는 2byte (short int) 타입 체크 기능이 필요하다.'

   Winmain (핸들러 정수값, 16비트 호환값, 실행파일의 위치를 전달 하는 값, 윈도우의 상태를 표시하는 값)

   이하, WinMain의 중요한 흐름은 별표로 표시하였음.

*/  

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,  LPTSTR lpCmdLine, int nCmdShow)

{

 

   UNREFERENCED_PARAMETER(hPrevInstance); // 대문자 함수는 메크로펑션 이며, ( UNREFERENCED_PARAMETER 는) 없어도 되는 코드다.

   UNREFERENCED_PARAMETER(lpCmdLine);     // 대문자 함수는 메크로펑션 이며, ( UNREFERENCED_PARAMETER 는) 없어도 되는 코드다.

 

   MSG msg;

   HACCEL hAccelTable;

 

   LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);         // IDS_APP_TITLE은 .rc 파일 - stirng table에 정의 되어 있는 메크로 변수임.

   LoadString(hInstance, IDC_MY201103151, szWindowClass, MAX_LOADSTRING); // IDC_SHINEX0307B은 .rc 파일 - stirng table에 정의 되어 있는 메크로 변수임.

 

   MyRegisterClass(hInstance); // ★ MyRegisterClass에 인스턴스 주소값을 넘긴다.

 

   if (!InitInstance (hInstance, nCmdShow)) // ★ 응용 프로그램 초기화를 수행한다. (내부에 CreatWindow 함수 있으며 윈도우 띄우는 기능을 함.)

   {

      return FALSE;

   }  

 

   hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY201103151));

 

   while (GetMessage(&msg, NULL, 0, 0)) // ★ 기본 메시지 루프이며, 이곳에서 메시지 큐에 저장되어 있는 메시지들을 픽업해 온다.

   {

      if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) // API 함수 

      {

         TranslateMessage(&msg);                              // API 함수 

         DispatchMessage(&msg);                               // API 함수 

      }

   }

   return (int) msg.wParam;

}

 

/*

   MyRegisterClass 원형 함수는 인스턴스 핸들값을 전달 받고, 윈도우를 등록하는 일을 합니다.

 

   cb      Count of Bytes    바이트 수

   dw      Double word       부호없는 long형 정수

   h       Handel            윈도우, 비트맵, 파일등의 핸들, 32비트 정수임. (중요)

   sz      Null Terminated   NULL 종료 문자열

   ch      Character         문자형

   a       Array             배열

   w       Word              부호없는 정수형

   i       Integer           정수형

   p, lp   Long pointer      포인터형

   b       Bool              논리형

*/

 

ATOM MyRegisterClass(HINSTANCE hInstance)

{

   WNDCLASSEX wcex;

 

   wcex.cbSize = sizeof(WNDCLASSEX);                                             // 윈도우 구조체의 크기(값)

 

   wcex.style = CS_HREDRAW | CS_VREDRAW;                                          // 클래스 스타일 지정

   wcex.lpfnWndProc    = WndProc;                                                  // 윈도우 프로시저 함수 명

   wcex.cbClsExtra      = 0;                                                        // 항상 0;

   wcex.cbWndExtra    = 0;                                                        // 항상 0;

 

   wcex.hInstance       =   hInstance;                                              // wcex에 인스턴스 핸들값을 저장한다.

   wcex.hIcon             =   LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY201103151));  // wcex로 창의 아이콘을 설정한다.

   wcex.hCursor         =   LoadCursor(NULL, IDC_ARROW);                            // wcex로 커서의 상태를 설정한다.

   wcex.hbrBackground =   (HBRUSH)(COLOR_WINDOW+1);                               // wcex로 배경값을 설정한다.

   wcex.lpszMenuName  =   MAKEINTRESOURCE(IDC_MY201103151);                       // wcex로 타이틀 바의 제목을, 핸들로 지정한다.

   wcex.lpszClassName =   szWindowClass;                                          // wcex로 클래스의 이름을, 핸들로 지정한다.

   wcex.hIconSm          =   LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));   // wcex에 작은 아이콘의 핸들을 지정한다.

 

   return RegisterClassEx(&wcex);  // 구조체, wcex를 리턴한다.

}

 

 

/*

   CreateWindow는 윈도우의 프레임을 생성해 주는 함수입니다.

 

   HWND CreateWindow (LPCTSTR className,          // 윈도우 클래스 명

 LPCTSTR title,              // 타이틀 명

 DWORD ws,                   // 윈도우 프레임 스타일 (Window Style 포스트 참조)

 int x,                      // 윈도우를 띄울 x 좌표 (좌측상단 기준)

 int y,                      // 윈도우를 띄울 y 좌표 (좌측상단 기준)

 int width,                  // x, y 좌표를 기준으로한 넓이, 우쪽으로 갈 수록 큰 값

 int height,                 // x, y 좌표를 기준으로한 높이, 아래쪽으로 갈 수록 큰 값
 HWND hParent,               // 부모 윈도우의 핸들, 대개 NULL

 HMENU hMenu,                // 자식 윈도우 또는 메뉴 식별값, 대개 NULL

 HANDLE hInstance,           // WinMain()의 인자 hInstance를 받아옴

 LPVOID lpParam);            // 대개 NULL

*/

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

   HWND hWnd;

 

   hInst = hInstance; // 인스턴스값을 저장한다.

 

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);  // 초기 주석 참고...

 

   if (!hWnd) // 만약, hWnd값이 이상하면 FALSE를 리턴한다.

   {

      return FALSE;

   }

 

   ShowWindow(hWnd, nCmdShow);  // 윈도우의 상태를 설정한다.

   UpdateWindow(hWnd);

 

   return TRUE;

}

 

/*

   사용자가 처리하는것이 아니라, 이미 틀로 짜여진 시스템(ex:OS)에서 불러서 쓰는 함수.

   즉, 이것은 이미 등록 되어져 있는 함수임.

   WM_QUIT 메시지가 이 메시지일 때, FALSE.

*/

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

   int wmId, wmEvent;

   PAINTSTRUCT ps;    

   HDC hdc;           // Handle Device Contect -> HDC : 장치에대한그리기정보** //출력하는모든함수는DC정보가필요함

 

   switch (message)

   {

      case WM_COMMAND:

      wmId = LOWORD(wParam);

      wmEvent = HIWORD(wParam);

 

      switch (wmId)

      {

         case IDM_ABOUT:

            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

            break

         case IDM_EXIT:

            DestroyWindow(hWnd);

            break

         default:

            return DefWindowProc(hWnd, message, wParam, lParam);

      }

      break;

 

      case WM_PAINT:  //그리는 메시지 (글자도 그리는거임ㅋ)

         hdc = BeginPaint(hWnd, &ps);

         EndPaint(hWnd, &ps);

      break;

 

      case WM_DESTROY: // x 커튼눌리는메시지

         PostQuitMessage(0); // API 함수** 이며, WM_QUIT를 발생시키고, 이 종료 메시지를 메시지 큐에 올려 놓는다.

         break;

      default:

         return DefWindowProc(hWnd, message, wParam, lParam); // API 함수**

   }

   return 0;

}

 

 

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

   UNREFERENCED_PARAMETER(lParam);

   switch (message)

   {

      case WM_INITDIALOG:

         return (INT_PTR)TRUE;

 

      case WM_COMMAND:

         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

         {

            EndDialog(hDlg, LOWORD(wParam));

            return (INT_PTR)TRUE;

         }

      break

   }

   return (INT_PTR)FALSE;

}