반응형

[ 교재 ]

열혈강의 Visual C++ 2008 MFC 윈도우 프로그래밍

저자 최호성 / 출판사 프리렉

1장: 윈도우 프로그래밍 모델

1. Hello World

  • WinMain() 함수를 통해 프로그램 시작
  • 사용자의 입력 이벤트는 메시지로 전환됨
  • 윈도우 운영체제는 이벤트에 따른 메시지를 메시지 큐에 추가함
  • 메인 메시지 루프는 메시지 큐에서 메시지를 꺼내서(Get Message() 함수) 처리(DispatchMessage() 함수)하는 핵심 코드임
  • 윈도우 종료 메시지를 처리하면 메인 메시지 루프가 끝나고 응용 프로그램이 종료됨

    int APIENTRY _tWinMain(…생략)
    {
    생략
        // 
    기본 메시지 루프입니다.
        while (GetMessage(&msg, NULL, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }

        …
    생략
    }

    코드설명:

GetMessage() 함수를 통해 메시지 큐(Message Queue)에서 메시지(Message)를 가져올 수 있으면 프로그램이 계속 실행되고, 메시지를 못 가져오게 되어 함수가 False를 리턴하면 프로그램이 종료됨

2. 메시지 큐(Message Queue)

  1. 마우스 클릭 이벤트 발생하고 이것을 운영체제가 감지함
  2. 윈도우 운영체제가 해당 이벤트의 메시지를 만든 후 자신이 갖는 시스템 큐에 메시지 추가
  3. 마우스 클릭 위치 등의 정보를 토대로 메시지를 전달할 응용 프로그램을 선택. 그리고 해당 프로그램의 메시지 큐에 메시지 전달하고 시스템 큐에서는 제거
  4. 새로운 메시지를 프로그램의 메시지 큐에 추가
  5. 프로그램의 프로세스가 메인 메시지 루프를 돌면서 메시지 큐에 메시지가 있는지 검사. 그러다가 새로운 메시지가 있으면 메시지 큐에서 꺼냄. 이 메시지를 인자로 윈도우 프로시저 함수를 호출
  6. 윈도우 프로시저 함수는 마우스 클릭으로 발생한 메시지에 해당하는 처리를 하고 결과를 프로그램에 반영

 

3. Message Driven 방식

Windows는 메시지 기반으로 동작(Message Driven)한다.

윈도우에서 메시지란? 모든 것이 "다"

예: 메모장이 화면 상에 나타나고, 이동하고, 키보드 입력을 받으면→메시지 생성

※ Main Message Loop가 멈추면(메시지 처리가 불가능) → "응답 없음"

반응형
,