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

20151112 API 수업 / 11번 남수진

by 알 수 없는 사용자 2015. 11. 12.
728x90
반응형
http://www.soen.kr/ 에서 다운받은 예제 소스에서 첫번째 폴더의 First.cpp 사용

  • 앞으로의 기본형 소스
  • 기본형을 쓰라면 이 소스를 작성한다

  • 헤더파일은 windows.h 하나만
  • LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    • LRESULT: long 형 반환값
    • CALLBACK
      • 컴파일 후 사라진다
        • 어셈블리 단계에서는 의미가 없다
        • 이걸 지워도 동작함
      • 운영체제가 호출하는 함수
        • 프로그램 내부에서는 호출되지 않음
      • 함수 call 방식을 결정(cdecl이나 stdcall)
    • HWND
      • 윈도우 핸들러(int 형 정수)
    • WPARAM
      • unsigned int 형(4byte)
    • LPARAM
      • long 형(4byte)
        • int가 16bit이던 시절에 32bit로 쓰다가 32비트로 넘어와서 int가 4byte가 되어서도 그대로 유지
  • HINSTANCE g_hInst;
    • HINSTANCE: 자료형의 일종
  • LPSTR lpszClass="First";
    • LPSTR
      • char *
    • lpsz
      • null로 끝나는 문자열의 포인터라는 뜻
      • lp : long pointer
      • s : string
      • z : zero
  • int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance ,LPSTR lpszCmdParam,int nCmdShow)
    • APIENTRY
      • 이 소스의 entry point
      • 컴파일할 때 없어짐
      • 함수의 call 방식을 define하고 컴파일러에게 알려줌
    • hInstance
    • hPrevInstance
      • 안쓰지만 옛날에 썼던게 남아있는거
    • lpszCmdParam
      • C 프로그램에서 argv랑 같은 기능
    • nCmdShow
      • 창을 화면에 보일 것인가 결정
  • HWND hWnd;
    • 윈도우 핸들러
  • MSG Message;
  • WNDCLASS WndClass;
    • 생성하는 윈도우의 정보를 가지고 있는 구조체
  • g_hInst=hInstance;
    • 다른 함수들이 hInstance에 접근할 수 있게 전역변수 g_hInst에 저장
  • WndClass : 윈도우 정보를 초기화
    • hbrBackground
      • 윈도우 창의 색깔
    • hCursor
      • 마우스 모양
    • hIcon
      • 윈도우 창 좌측 상단의 아이콘
    • hInstance
      • 윈도우의 첫번째 인자를 세팅한다
    • lpfnWndProc
      • lpfn: 함수 포인터
      • 함수의 주소를 넣는다
      • 운영체제는 어플리케이션에 마우스의 위치 정보 등을 전한다
        • 이를 메시지라 한다
        • 해당 어플리케이션을 클릭하거나 마우스를 그 위로 지나갈 때 어플리케이션에 메시지를 전송
          • 어플리케이션이 해당 동작에 맞는 기능을 수행하도록 한다
          • 오토 마우스같은 경우에는 윈도우 디바이스 드라이버를 설치하여 구현
      • lpfnWndProc은 운영체제에서 날아오는 메시지를 처리할 함수를 설정한다
        • 함수 이름은 WndProc 이외에 다른 것으로 해도 된다
    • lpszClassName
      • 실행 중인 윈도우 창의 소속을 구분하기위해 설정
      • 예를 들어 메모장에서 파생된 찾기, 다른이름으로 저장 창은 모두 메모장과 같은 lpszClassName을 가진다
    • lpszMenu
      • 메뉴 창
    • style
  • RegisterClass(&WndClass);
    • WndClass 구조체의 정보대로 윈도우 창을 만들기위해 윈도우 운영체제에 등록하는 함수
    • 이 이후로 WndClass는 쓸모가 없다
  • hWnd=CreateWindow(   lpszClass,
                            lpszClass,                    - 상단에 표시되는 창의 이름
                            WS_OVERLAPPEDWINDOW,   - 윈도우 모양을 좌우한다(soen의 API 초급강좌 2-3-마 윈도우 스타일에서 확인할 수 있다)
                            CW_USEDEFAULT,           
    - 창의 가로, 세로 크기를 결정
                            DW_USEDEFAULT,
                            CW_USEDEFAULT,
                            NULL,
                            (HMENU)NULL,
                            hInstance,
                            NULL);
    • 나중에 실습하면서 다시 볼거임
  • ShowWindow(hWnd,nCmdShow);
    • 창이 화면에 나타날지를 결정(2번째 인자 nCmdShow가 결정)
    • nCmdShow : WinMain의 4번째 인자, 창의 표시를 결정


  • while문
    • GetMessage(&Message,0,0,0)
      • 윈도우가 보내는 메시지를 받는 함수
      • 메시지 큐에서 있는 메시지 중 가장 오래된 메시지를 가져와서 Message 변수에 저장한다.
        • 마우스의 움직임, 화면의 움직임 등 모든 정보를 처리하기위해 윈도우에서 많은 양의 메시지를 보낸다
        • 윈도우가 보내는 메시지는 메시지 큐에 저장되는데 이것은 원형 큐 형태를 가지고 있다
          • 윈도우가 보내는 메시지가 어플이 저장하고 있는 최대 메시지양보다 더 많이 들어오면, 어플이 보관하고 있는 가장 오래된 메시지는 삭제된다
      • 창을 종료시키면 0을 반환하고 프로그램이 종료된다
    • TranslateMessage(&Message);
      • 키 입력을 해석
      • 예) 키보드 입력 신호에서 A,a,ㅁ 구분 
    • DispatchMessage(&Message);
      • 윈도우가 처리하고 남은 쓰레기를 넘긴다
      • 윈도우에 처리 상황을 보고 하면 윈도우가 WndProc을 호출
  • return Message.wParam;
    • 리턴값이 윈도우 로그에 남는다


  • LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
    • 어떤 일을 할지를 정하는 함수
    • WinMain이 껍데기고 이 함수가 핵심
    • iMessage
      • 이벤트 정보(메시지 번호)
      • 이 값에 따라 수행할 작업을 결정한다
    • WM_DESTROY
      • WM: Window Message의 약자
      • 창을 종료시킬 때 발생하는 메시지
        • 창을 닫기 전에 어떤 일을 처리하기 위해서 종료신호도 메시지로 처리
      • PostQuitMessage(0)
        • 윈도우 메시지 큐에 0을 대입한다
          • GetMessage에서 0이 반환됨
            • WinMain의 while문이 종료되며 프로그램 종료

    • First In First Out 개념의 자료 구조



  • 기본 소스로 예제 소스 컴파일
    • Visual Studio 2013에서 WIin32 프로젝트를 생성 후, 위의 소스를 붙여 Ctrl+F5로 컴파일
    • 기본창이 실행되는 것을 확인한다




728x90