Busan IT/WinAPI2015. 11. 12. 17:43

WinAPI 기본형 코드


WinAPI기본형을 작성하고 분석해 보자.


#include <windows.h> //헤더 파일은 이것 하나면 된다.

LRESULT CALLBACK /* 인트형 반환값이다.*/ WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);

HINSTANCE g_hInst;
LPSTR lpszClass = "First";

/// 윈도우 창을 설정하는 함수
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
  HWND hWnd;
  MSG Message;
  WNDCLASS WndClass;
  g_hInst = hInstance;
  
  /// class 구조체 초기화
  WndClass.cbClsExtra=0;
  WndClass.cbWndExtra=0;
  WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);   //창의 전체 색 -> 흰색
  WndClass.hCursor=LoadCursor(NULL, IDC_ARROW);              // 커서 모양 -> 화살
  WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);           // 아이콘 -> 창 왼쪽 상담에 표시되는 아이콘 
  WndClass.hInstance=hInstance;                  // 해당 구조체에 main의 초기값을 넣어준다.(must)
  WndClass.lpfnWndProc=(WNDPROC)WndProc;            // 함수의 주소를 넣는 자리, 응용 프로그램 관련 이벤트 메세지를 받을 함수의 주소, 함수 이름을 바꿔도 무관하다.
  WndClass.lpszClassName=lpszClass;                // 실행 단위를 class라 부른다. 프로그램 단위로 실행되는 명령어가 한정된다.
  WndClass.lpszMenuName=NULL;                  // 메뉴 
  WndClass.style=CS_HREDRAW | CS_VREDRAW;          // 윈도우 창 크기 조절
  RegisterClass(&WndClass);                    // 설정된 내용을 등록

  hWnd=CreateWindow(  lpszClass, 
            lpszClass,                 //창의 제목
            WS_OVERLAPPEDWINDOW,           //창의 속성값 지정
            CW_USEDEFAULT,               //가로, 세로 시작점(X, Y좌표)
            CW_USEDEFAULT, 
            CW_USEDEFAULT,               //가로, 세로 크기(X, Y좌표)
            CW_USEDEFAULT, 
            NULL,                   
            (HMENU)NULL, 
            hInstance, 
            NULL);
  
  ShowWindow(hWnd, nCmdShow);                // 화면의 출력 여부를 선택, 윈도우가 결정한다. 

  while(GetMessage(&Message, 000))              //윈도우가 보내는 메세지를 받는 함수, 가장 오래된 메세지를 가지고 온다.
  //// 창을 닫는 메세지는 '0'이다.
  {
    TranslateMessage(&Message);                //메세지를 해석
    DispatchMessage(&Message);                //윈도우가 처리하고 남은 값을 처리한다.
  }
  return Message.wParam;                    //리턴 값은 int, 윈도우 로그에 남는다.
}
//// 실제 프로그램을 실행시키는 함수
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,/*이벤트 번호가 온다*/ WPARAM wParam, LPARAM lParam)
{
  switch(iMessage)
  {
    case WM_DESTROY:      //Window Message Destroy 윈도우 종료
                  //프로그램 종료시 정리해야 할 것들을 수행한다.
        PostQuitMessage(0);  //종료
        return 0;
  }

  return(DefWindowProc(hWnd, iMessage, wParam, lParam));   //프로그램이 인식하지 못하는 메세지는 윈도오로 다시 보낸다.
  
}
  
    

 

#include <windows.h> //헤더 파일은 이것 하나면 된다.

 

LRESULT CALLBACK /* 인트형 반환값이다.*/ WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);

 

LRESULT CALLBACK: long result 내부 프로그램에서는 호출할 수 없다. 호출 방식이 STD call 혹인 CDECL인지...

HWND: Window Handler, 인트형이다.

WPARAM: Word(4byte) 인자, type define이 되어 있다.

LPRAMWPRAM의 용량의 크기는 없다. 과거 메모리 용량이 작을 때 구분하여 사용하던 것이다.

 

HINSTANCE g_hInst; g for global, h for handler

LPSTR lpszClass = "First"; //long pointer string: 캐릭터 포인터

 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)

 

APIENTRY : API entry, 컴파일러에게 call 방식이 무엇인지 알려준다.

두 번째 인자는 예전에 사용하던 것이여서 그대로 인자로 적어놓고 있지만 사용하지 않는다.

 

LPSTR lpszCmdParam: 명령어 입력

 

int nCmdShow: 명령어 표시 여부를 선택하는 인자

 

WNDCLASS WndClass; 구조체이다. struct

 

g_hInst = hInstance; //사용한 인자를 전역변수에 복사함으로써 데이터 공유

 

응용프로그램 창에 커서를 올리면 운영체제에서 이벤트를 발생하여 응용프로그램에게 전달한다.



 

 

사용자가 운영체제에서 명령하는 메시지의 수가 CPU의 능력을 초과할 경우 메시지는 지속적으로 쌓이지 않고 기존 메시지에 덮어쓰게 된다.

 

FIFO(First In First Out): Queue 구조

FILA(First In Last Out): Stack 구조

 

실시간 처리 시스템은 1개 이상의 프로그램을 실행하지 못한다.

작성한 소스코드를 그대로 복사하여 Visual Studio에 붙힌다.

 

새로운 프로젝트를 생성하고 Visual C++에서 console이 아닌 project를 선택한다. 소스파일을 ‘main.c'이름으로 추가한다.

 

F5를 눌러 실행한다. 새로운 창이 뜨면 제대로 컴파일이 된 것이다. 새로운 창의 이름이 한자로 뜬다. 이것을 해결하기 위해 전역 변수 LPSTR lpszClassL을 추가해준다.

 

LPSTR lpszClass = L"First"

 

 

나머지 설명은 내일...

반응형

'Busan IT > WinAPI' 카테고리의 다른 글

winsock을 사용한 서버/클라이언트 프로그램  (0) 2015.11.30
히스토그램 , 알파값  (0) 2015.11.25
WIN32API로 BMP뷰어  (0) 2015.11.22
20151118 윤재희 #5. 그래픽 & 게임  (0) 2015.11.18
입력  (0) 2015.11.16
Posted by newind2000