본문 바로가기
개발/Windows

[Win32] 윈도우의 닫기 버튼을 눌렀을 때 일어 나는 일 (WM_CLOSE)

by lucidmaj7 2022. 7. 31.
728x90
반응형

이번 포스트에서는 Win32 GUI프로그래밍을 공부하면서 거의 처음으로 배우는 내용인 윈도우가 닫힐 때 일어나는 일에 대해서 알아보겠다. 쌩으로 Win32부터 MFC, WTL까지 하다보니 좀 오래전에 공부해서 인지 가물가물하여 다시한번 리마인드 차원에서 정리해본다.

Windows에서 창의 닫기 버튼을 눌렀을때 어떤일이 발생할까?

사용자가 닫기창이 눌렸을 때, 개발자는 많은 것을 고려해야 할 수 있다. 단순히 창을 hide할 것인지, 정말로 프로그램을 종료할 것 인지? 종료한다면 메모리정리, 리소스 정리, 사용자가 작업한 내용, 프로그램의 상태등을 안전하게 정리할 것인지 고려 해야 할 수 있을 것 이다. 닫기동작은 나름 그래서 중요하다고 생각한다.

그럼 닫기 버튼을 눌렀을 때 어떤 일이 발생할까?

https://docs.microsoft.com/en-us/windows/win32/learnwin32/closing-the-window

 

Closing the Window - Win32 apps

When the user closes a window, that action triggers a sequence of window messages.

docs.microsoft.com

MSDN에 따르면 창의 닫기 버튼을 클릭하면 WM_CLOSE메시지가 발생 한다고 되어있다. 

case WM_CLOSE:
    if (MessageBox(hwnd, L"Really quit?", L"My application", MB_OKCANCEL) == IDOK)
    {
        DestroyWindow(hwnd);
    }
    // Else: User canceled. Do nothing.
    return 0;

개발자는 WM_CLOSE 메시지 콜백에서 정말로 애플리케이션을 종료할지? 등을 사용자에게 물어볼 수 있으며 정말 종료하겠다면 DestroyWindow함수를 호출 하여 WM_DESTROY메시지를 발생시킬 수 있다. 반면 아무것도 작업하지 않고 0을 리턴한다면 아무런 일도 발생하지 않게 된다.

다만 여기에 트릭이 있는데 WM_CLOSE를 구현하지 않거나 WM_CLOSE에서 디폴트 프로시저 DefWindowProc 를 호출해버리면 알아서 WM_DESTROY가 발생된다.

WM_DESTROY

WM_CLOSE에서 DestoryWindow를 호출 하였다면 WM_DESTORY메시지가 발생하여 Destory콜백으로 들어오게 된다. 이 시점에는 Window는 스크린에서 소멸된 상태이며 아직 진짜 소멸이 되기 바로 전인 상태이다. 여기서 개발자는 WM_QUIT 메시지를 발생 시킬 수 있다.

case WM_DESTROY:
    PostQuitMessage(0);
    return 0;

WM_QUIT를 받으면 메시지루프는 종료되며 정말로 프로그램은 종료되게 된다.

정리하자면. 다음과 같은 차트를 그릴 수 있다.

이제는 헷갈리지 말자.

 

참고

https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-close

 

WM_CLOSE message (Winuser.h) - Win32 apps

Sent as a signal that a window or an application should terminate.

docs.microsoft.com

https://docs.microsoft.com/en-us/windows/win32/learnwin32/closing-the-window

 

Closing the Window - Win32 apps

When the user closes a window, that action triggers a sequence of window messages.

docs.microsoft.com

https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-destroy

 

WM_DESTROY message (Winuser.h) - Win32 apps

Sent when a window is being destroyed. It is sent to the window procedure of the window being destroyed after the window is removed from the screen.

docs.microsoft.com

 

728x90
반응형

댓글