본문 바로가기
코스웨어/15년 스마트컨트롤러

20151112 윤재희 API #1 WinAPI 기본형 코드

by 알 수 없는 사용자 2015. 11. 13.
728x90
반응형

==================================Outline====================================

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이 되어 있다.

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

 

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 lpszClass에 L을 추가해준다.

 

LPSTR lpszClass = L"First"

 

 

나머지 설명은 내일...

728x90