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

20151113 김태현 WinAPI 1일차 기본문 분석

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

#include <windows.h>

//함수 원형 LRESULT(int형,windows.h에 디파인 되어있다) CALLBACK은 컴파일하면 없어진다
LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, LPARAM);

//전역 변수 선언부분 h=handeler
HINSTANCE g_hInst;

//long pointer string zero = lpsz(널로 끝나는 문자열)
//LPSTR은 Long Pointer STRING 이므로 char *를 뜻한다 보면 된다.
LPSTR lpszClass="First";


//APIENTRY 엔트리 포인트라는 표시(STDCALL CDECLCALL 인지 표시하는 역할도 한다)
//두번째 인자는 안쓰는 것이다.(옛날에 쓰던것) 세번째 인자는 명령어를 입력받는 인자이다.
//네번째 인자는 화면에 보여줄것인지 말것인지를 정하는 인자
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
  //PASS
  HWND hWnd;
  //PASS
  MSG Message;
  //클레스라고 적혀있지만 구조체이다.
  WNDCLASS WndClass;
  //다른 함수들이 가능하도록 winmain에서 받는 첫번째 인자를 전역 변수에 저장한다.
  g_hInst=hInstance;

  //구조체는 윈도우의 정보를 다들고 있다.
  //구조체를 초기화 시켜준다
  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;
  //함수 주소를 넣는 자리 lpfn(Long pointer function)
  WndClass.lpfnWndProc=(WNDPROC)WndProc;
  //실행중인 한덩어리를 Class라 부른다. 전역변수가 들어갔으므로 First
  WndClass.lpszClassName=lpszClass;
  //메뉴를 추가하면 NULL자리에 넣어주면 된다
  WndClass.lpszMenuName=NULL;
  //윈도우 가로세로 크기의 조절이 가능한걸 설정한다.
  WndClass.style=CS_HREDRAW | CS_VREDRAW;

  //위의 구조체를 윈도우에 등록하는 함수이다.
  //위의 선언해주고 RegisterClass함수로 등록을 해야지 제대로 윈도우에 들어간다.
  //위의 구조체는 이 함수를 사용하고나면 사용가치가 없다.
  RegisterClass(&WndClass);

  //첫번째 Class 이름을 적는것, 두번째 인자는 창이 뜨면 창에 표시될 이름 메모장의 경우는 메모장이라고 뜨겠지
  //세번째 윈도우 모양을 설정한다 define 되어있다.
  //4,5,6,7번째 인자는 가로크기 세로크기를 설정한다0을 넣으면 운영체제가 알아서 설정해준다.
  //4,5은 전체 창에서의 6번째 점의 위치를 잡는 좌표이고
  //6,7은 왼쪽 위 모서리의 시작점 오른쪽 밑 모서리의 시작점이다.
  //나머지는 Pass
  hWnd=CreateWindow(  lpszClass,
        lpszClass,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        (HMENU)NULL,
        hInstance,
        NULL);

  //창이 화면에 나타날지 안나타날지 셋팅하는 함수(WinMain의 4번째 함수를 받는다)
  //Main에서 셋팅해 놨으니 윈도우가 결정한다.
  ShowWindow(hWnd,nCmdShow);

  //while문이 도는동안 어플리케이션이 실행된다.
  //while문에서 운영체제가 보내는 메세지를 받는다.
  //GetMessage 함수는 메세지 큐에서 제일 오래된 메세지를 가져온다.
  //창닫는 메세지가 0을 return하기 때문에 종료 조건에 &Message,0,0,0 가 있다.
  //전달되 메세지를 저장하는 곳이 첫번째 인자이다.
  while(GetMessage(&Message,0,0,0))
  {  
    //키보드를 처리하는 함수
    TranslateMessage(&Message);
    //위에서 처리하고 남은 것들을 처리하는 함수.
    //함수가 호출되면 설정해놓은 함수가 호출된다.(WndPorc)
    DispatchMessage(&Message);
  }
  //int 형으로 반환
  return Message.wParam;
}

//위의 Main함수는 전체적으로 윈도우 값을 셋팅하는 함수이고
//실질적으로 일하는 함수이다
//두번째 인자가 처리할 이벤트 번호이다.
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
  switch(iMessage)
  {
    //창닫는 키를 누르면 메세지 큐에 0을 보내 프로그램을 종료시킨다.
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  }
  return (DefWindowProc(hWnd, iMessage, wParam,lParam));
}

728x90