본문 바로가기

무작정 따라해보기(정리, 문제풀기)/Win32API

6. Win32 API 프로그래밍

728x90

 

'나우캠퍼스X아워즈팜'유튜브의 'Win32 API 2강. Win32 API 프로그래밍 구조 (3/5)'영상을 보고 정리한 내용입니다.

 

WinMain안의 코드들에 대한 설명

 

윈도우 구조체 설정과 등록

  • 윈도우 클래스의 정보를 담을 구조체 설정하기
    WNDCLASSEX wc;
  • 필요한 정보로 구조체를 채웁니다. 

    wc.cbSize = sizeof(WNDCLASSEX);
    //구조체 크기를 설정.
    wc.style = CS_HREDRAW | CS_VREDRAW;
    //윈도우가 이동하거나 크기가 변할 때 윈도우를 다시 그리겠다는 뜻. 모두 픽셀로 이루어져있기 때문에 다시 그림.
    wc.lpfnWndProc = WindowProc;
    //사용하려는 윈도우 프로시저의 함수명(함수의 메모리 주소)을 설정해서 윈도우 프로시저 함수를 연결시켜준다.(그래서 포인터 변수)
    wc.hInstance = hInstance;
    //WinMain의 매개변수 hInstance를 넘겨준다.
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;

    //h가 붙어있는 것은 모두 핸들이고 각각을 나누며 os의 자원을 빌려서 쓴다.(양의 정수값)

    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    //IDC_ARROW는 운영체제에 설정되어있다. 가장 기본적인 화살표 커서로 쓰겠다는 뜻
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    //배경 색을 흰색으로 설정해준다.
    wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    //바탕화면에 생길 아이콘(더블클릭하여 실행하는)을 설정. 운영체제에서 사용하는 기본 아이콘으로 설정
    //MAKEINTRESOURCE는 매크로 함수이다. id를 양의 정수로 바꾸어 준다. IDI_APPLICATION는 기본 아이콘.
    wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    //작은 아이콘
    wc.lpszMenuName = nullptr;
    //메뉴에 대한 것을 지정해 줄 수 있다.
    wc.lpszClassName = L"WindowClass1";
    //레지스터 클래스로 해당하는 구조체를 os에 등록을 하는데 등록을 할 때 쓰이는 이름이다.

    RegisterClassEx(&wc);
    //RegisterClassEx 클래스에 구조체를 등록한다.

 

윈도우 생성

  • CreateWindow 함수(윈도우 생성을 위한 함수. 윈도우를 생성 후 그것에 대한 아이디인 핸들(양의 정수값)을 리턴)
    HWND WINAPI CreateWindow(
            LPCSTR lpClassName, //구조체명/wc.lpszClassName = L"WindowClass1";
    위에서 설정한 이름과 같아야함/윈도우 클래스의 이름
            LPCSTR lpWindowName, //타이틀바 이름. 윈도우 제목 
            DWORD dwStyle, //윈도우 형태(윈도우 스타일) 
            int x, int y, //출력 좌표
            int nWidth, int nHeight, //윈도우 전체 크기
            HWND hWndParent, //부모 윈도우
            HMENU hMenu, //메뉴바
            HINSTANCE hInstance, //인스턴스
            LPVOID lpPAram); //여분
  • 윈도우 생성
        // 창을 만들고 결과를 핸들로 사용 
        hWnd = CreateWindow(
            L"WindowClass1", // 윈도우 클래스의 이름
            L"Our First Windowed Program",//타이틀바 이름. 윈도우 제목 
            WS_OVERLAPPEDWINDOW, // 윈도우 스타일. 윈도우 스타일은 WS_OVERLAPPEDWINDOW가 가장 기본적인 형태 
            300, // 윈도우의 x- 위치(기본: CW_USEDEFAULT)
            300, // 윈도우의 y- 위치(기본: CW_USEDEFAULT)
            500, // 윈도우의 너비 
            400, // 윈도우의 높이 
            NULL, // 부모 창 없음, NULL 
            NULL, // 메뉴를 사용하지 않음, NULL 
            hInstance, // 응용 프로그램 핸들 
            NULL); // 여러 창에 사용, NULL 

 

윈도우 출력

  • ShowWindow(hWnd, nCmdShow); //해당하는 윈도우를 출력하기. nCmdShow와 SW_SHOW는 같다.
    UpdateWindow(hWnd); // WM_PAINT에 출력할 내용들이 들어간다. 화면을 갱신한다.

 

MSG 구조체

  • typedef struct tagMSG {
        HWND        hwnd;
        UINT        message;
        WPARAM      wParam;
        LPARAM      lParam;
        DWORD       time;
        POINT       pt;
    #ifdef _MAC
        DWORD       lPrivate;
    #endif
    } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
  • hwnd -- 윈도우의 핸들
  • message -- 보내질 메시지 ex) 마우스가 움직였을 때
  • wParam, lParam -- 부가적인 메시지 ex) 마우스 좌표

 

메시지 루프

  • MSG msg;
        //다음 메시지를 기다렸다가 메시지가 오면 결과를 msg에 저장 
        while (GetMessage(&msg, NULL, 0, 0))
        {
            // 키 입력 메시지가 있을 경우 키 입력 메시지를 msg에 저장
            TranslateMessage(&msg);
            // msg를 WndProc(윈도우 프로시저)에 보내줍니다.
            DispatchMessage(&msg);
        }
        // WM_QUIT 메시지가 발생하면 while문을 빠져나오며 프로그램이 종료됩니다.
        return 0;
  • 메시지 루프에 이 3가지의 함수가 있다.
    GetMessage(&msg, NULL, 0, 0)
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  • GetMessage함수를 통해서 메시지를 가져오며 MSG 구조체를 채워준다.
    메시지 WM_QUIT가 발생할 때 FALSE를 리턴하며 while문을 빠져나와 프로그램이 종료된다.
  • TranslateMessage함수는 키와 관련된 정보가 발생됐을 때 반응한다.
    키 입력이 있으면 그 키 입력이 os의 메시지 큐에 모두 저장되며 메시지 큐에 있는 것을 응용 프로그램에서 메시지 큐를 체크하며 처리한다.
  • DispatchMessage함수는 메시지가 발생하였을 때 WndProc함수를 호출하며 WndProc함수에서 메시지 처리를 끝내고 메시지를 전달할 때까지 기다린다.

 

혹시 제가 잘못 이해한 부분이(잘못된 정보) 있다면 알려주시면 감사하겠습니다. :)