윈도우 메시지를 처리하는 핵심 함수
( 윈도우 클래스당 하나씩 배정된다. )
콜백 함수
: 메시지가 입력되면 윈도우에 의해 호출되어 메시지를 처리한다.
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 등의 함수로 메시지를 보내 간접적으로 호출해야 함
WM_KEYDOWN, WM_LBUTTONDOWN⑴ 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을 넣는다. "
MY_QUIT: 응용 프로그램을 종료하라는 신호
PostQuitMessage 함수 호출에 의해 발생한다.GetMessage 함수가 0을 리턴하도록 함으로서 메시지 루프를 종료 시키는 역할을 한다.MSG msg;
while(Getmessage(&msg, 0, 0, 0))
{
DispatchMessage(&msg);
}
⑴ GetMessage()
msg 변수에 저장한다.WM_QUIT이면 0을 리턴하면서 while문을 빠져나간다.⑵ TranslateMessage
⑶ DispatchMessage
즉, GetMesssage()가 메시지를 읽고,
TranslateMessage가 문자 메시지로 변환하고,
DispatchMessage가 메시지를 윈도우 프로시저로 보낸다.