ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WinMain과 프로시저,메시지큐
    Windows Programming/Win32API 란? 2022. 3. 18. 17:42

     

    WinMain의 기본인자

    HINSTANCE hInst: 자신의 인스턴스 값(주소) 코드의 시작주소가 전달

     

    HINSTACE hPrev: 현재 사용안함(과거에는 사용됨) 현재는 NULL전달

     

    LPWSTR lpCmdLIne: 명령행 인자(프로그램 시작시 전달되는 정보)

     

    int nCmdShow : 프로그램 시작시 전달되는 window 초기 모양

     


    윈도우 프로시저

     

    윈도우 프로시저는(Window Procedure) 윈도우 클래스당 하나씩 배정되며 메시지에 대응하는 방식을 정의함으로써 윈도우의 행동 양식을 결정

     

    윈도우 프로시저는 아래와 같은 원형을 가짐

     LRESULT CALLBACK WndProc(HWND hWNd, UINT iMessage, WPARAM wParam, LPARAM lParam);

     

    인수의 내용

     

    문법적으로 함수이지만 일반 함수와 차이점이 있다.

    • 리턴타입과 인자를 변경X
    • 운영체제의 의해 호출되는 콜백함수
    • 사용자가 직접 함수의 이름으로 호출X (만약 호출 필요시 SendMessage 등의 함수로 간접적 호출)

    윈도우 프로시저는 전달되는 무수히 많은 메시지들을 처리하므로 거대한 switch 문으로 구성된다.

     

    프로시저[메시지 처리, 반복 호출]

    CALLBACK : 미리 등록해 놓으면 필요할 때 호출

     

    GetMessage() //자신의 MQ에서 메시지 가져오기...

    GetMessage() 가 리턴했다는건 메시지가 발생 한 경우 

    return 이 FALSE 인 경우는 WM_QUIT 메시지이다.

     

    DispatchMessage() 가져운 메시지를 미리 등록된 Proc 전달..

     

     

    WM_CREATE : 초기화 [호출시점 : 윈도우가 생성되고 눈에 보이기전]

     

    WM_DESTROY: 종료처리 [호출시점 : 윈도우가 파괴되고 나서]

     

    WM_CLOSE: 메인 윈도우를 종료하고자 할때 발생하는 최초 메시지

    1. 윈도우가 파괴가 된다.DestroyWindow()
    2. 윈도우가 종료됨을 비큐메시지로 알림 WM_DESTROY

    PostQuitMessage() : 메시지큐에 메시지를 보낸다. 메시지 종류 WM_QUIT

     

    내가 처리할 이벤트들은 case문으로 작성 하면되고 나머지는 DefWindowProc가 처리 해준다.


    메시지 큐

     

    1. 큐 메시지

    2. 비큐 메시지

     

    비큐 메시지

    윈도우에 특정 사실을 알리거나 명령을 내리기 위해 큐를 통과하지 않고 바로 윈도우 프로시저로 보내지는 메시지 이다.

     

    WM_CREATE(대표적인 비큐메시지)라는 메시지의 흐름이다.

     

    1. 사용자가 윈도우를 만들기 위해 CreateWindowEx API를 호출하면 윈도우가 만들어지고
    2. 윈도우가 만들어졌다는 사실을 사용자에게 알리기 위해WM_CREATE 라는 메시지가 메시지 처리함수에 전달된다.
    3. WM_CREATE 메시지 처리가 완료되면 CreateWindowEx 함수는 윈도우 핸들을 리턴한다.

    , WM_CREATE 메시지는 메시지 큐에 놓이지 않고 직접 윈도우 프로시져에 전다된다. 이를 비큐메시지 라고 한다.

        입력 메시지(마우스, 키보드 메시지)를 제외한 대부분의 메시지가 비큐 메시지이다.

     

    큐 메시지

     마우스 키보드 메시지들은 직접 윈도우 프로시저로 전달되지 않고 메시지 큐에 놓이게 되는 데 이를 큐메시지라고 함

     

    큐 메시지 흐름도

    큐 메시지는 주로 사용자 입력으로 발생되는 데 WM_KEYDOWN, WM_LBUTTONDOWN 등이 대표적이며 그 외 WM_PAINT, WM_TIMER, WM_QUIT 등이 큐 메시지이다.

    큐 메시지는 발생 직후 시스템 메시지 큐에 저장되어 스레드 메시지 큐로 보내지며 최종적으로 윈도우 프로시저에 의해 입력된 순서대로 처리된다.

    큐에 놓인 메시지를 처리하려면 반드시 사용자가 큐에 놓여 있는 메시지를 가져오는 메 시지 루프가 필요하다.

    GetMessage API 가 그 일을 수행한다.

     

    MSG msg;

    while ( GetMessage( &msg, 0, 0, 0 ) )

    {

      TranslateMessage(&msg);

      DispatchMessage(&msg);

    }

     

    GetMessage API는 메시지 큐에 WM_QUIT 메시지가 있을 경우에만 TRUE 값을 리턴한다. 그래서 위 코드는 WM_QUIT 메시지가 큐에 들어올 때 까지는 무한 루프가 된다.

    'Windows Programming > Win32API 란?' 카테고리의 다른 글

    DC와 무효화 영역  (0) 2022.03.28
    PeekMessage()  (0) 2022.03.24
    윈도우 핸들(HWND)  (0) 2022.03.20
    win32api란?  (0) 2022.03.11

    댓글

Designed by Tistory.