9/3 API - Message (큐, 비큐, 메시지 루프)

정수현·2024년 9월 3일

API Programming

목록 보기
4/10

윈도우 프로시저

  • 윈도우 메시지를 처리하는 핵심 함수
    ( 윈도우 클래스당 하나씩 배정된다. )

  • 콜백 함수
    : 메시지가 입력되면 윈도우에 의해 호출되어 메시지를 처리한다.

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

}

인수

⑴ hwnd - 메시지를 받을 윈도우 핸들 (윈도우 구분 목적)

⑵ iMessage - 전달된 메시지의 종류

⑶ wParam, lParam - 메시지별 부가적 정보 (메시지에 따라 값들의 의미는 달라진다)

특징

LRESULT CALLBACK Wndproc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{
  switch (msg)
  {
  }
}

⑴ 리턴타입과 인자 변경 X
⑵ 사용자가 직접 함수의 이름으로 호출할 수 없다.
-> SendMessage 등의 함수로 메시지를 보내 간접적으로 호출해야 함

  • swtich문으로 작성된다, 메시지가 많을수록 case문이 많아진다.
  • 처리하지 않는 메시지는 DefWindowProc으로 전달한다.

메시지 큐

큐 메시지

  • 메시키 큐로 들어간다.
  • 사용자 입력으로 발생된다. ex) WM_KEYDOWN, WM_LBUTTONDOWN
  • 메시지 발생 -> 메시지 큐에 저장 -> 스레드 메시지 큐 => 윈도우 프로시저에 입력된 순서대로 처리된다.

비큐 메시지

  • 곧바로 윈도우 프로시저로 보내진다. (메시지 큐에 들어가지 X)
  • 윈도우에게 특정 사실을 알리거나 명령을 하기 위해 사용

종류

CreateWindow -> WM_CREATE
MoveWindow -> WM_SIZE,WM_MOVE
DestroyWindow -> WM_DESTROY
WM_CREATE -> WM_ACTIVATE

흐름

  • 시작점
case WM_CRAETE:
{
  MessageBox(hwnd, TEXT("CreateWindow에서 호출(비큐)"),
  			TEXT("WM_CREATE"), MB_OK);
  return 0;
}

CreateWindowEx 호출 -> 윈도우 및 hwnd(핸들) 생성
WM_CREAT 메시지 발생 -> 메시지 처리 함수에 전달된다. (비큐)
WM_CREAT가 완료 -> CreateWindowEX 함수는 hwnd 핸들 반환
ShowWindow -> 스크린에 보여진다

  • 끝점
case WM_DESTROY:
{
  MessageBox(hwnd, TEXT("DestroyWindow에서 호출(비큐)",
 			TEXT("WM_DESTROY"), MB_OK);
  PostQuitMessage(0);
  return 0;
}
return DefWindowproc(hwnd,msg,wparam,lparam);

⑴ 창 닫기 버튼 -> WM_CLOSE 메시지 발생 -> DefWindowproc에 전달
⑵ 윈도우 객체 소멸, 윈도우 창 사라짐
WM_DESTROY를 호출


메시지 루프

WM_QUIT

" 메시지 큐에 WM_QUIT을 넣는다. "

MY_QUIT: 응용 프로그램을 종료하라는 신호

  • PostQuitMessage 함수 호출에 의해 발생한다.
  • GetMessage 함수가 0을 리턴하도록 함으로서 메시지 루프를 종료 시키는 역할을 한다.

메시지 루프

MSG msg;
while(Getmessage(&msg, 0, 0, 0))
{
  DispatchMessage(&msg); 
}

GetMessage()

  • 메시지 큐에서 메시지 하나를 꺼내 msg 변수에 저장한다.
  • WndProc 콜백 함수에서 메시지가 있을 땐 WM_QUIT을 제외한 모든 메시지에 대해 1을 도렬줌
  • 꺼낸 낸 메시지가 WM_QUIT이면 0을 리턴하면서 while문을 빠져나간다.

TranslateMessage

DispatchMessage

  • 메시지를 윈도우 프로시저로 보낸다.

즉, GetMesssage()가 메시지를 읽고,
TranslateMessage가 문자 메시지로 변환하고,
DispatchMessage가 메시지를 윈도우 프로시저로 보낸다.

GetMessage함수 이해하기

WM_CLOSE, WM_DESTROY, WM_QUIT의 차이

0개의 댓글