이번 포스트에서는 Win32 GUI프로그래밍을 공부하면서 거의 처음으로 배우는 내용인 윈도우가 닫힐 때 일어나는 일에 대해서 알아보겠다. 쌩으로 Win32부터 MFC, WTL까지 하다보니 좀 오래전에 공부해서 인지 가물가물하여 다시한번 리마인드 차원에서 정리해본다.
Windows에서 창의 닫기 버튼을 눌렀을때 어떤일이 발생할까?
사용자가 닫기창이 눌렸을 때, 개발자는 많은 것을 고려해야 할 수 있다. 단순히 창을 hide할 것인지, 정말로 프로그램을 종료할 것 인지? 종료한다면 메모리정리, 리소스 정리, 사용자가 작업한 내용, 프로그램의 상태등을 안전하게 정리할 것인지 고려 해야 할 수 있을 것 이다. 닫기동작은 나름 그래서 중요하다고 생각한다.
그럼 닫기 버튼을 눌렀을 때 어떤 일이 발생할까?
https://docs.microsoft.com/en-us/windows/win32/learnwin32/closing-the-window
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
https://docs.microsoft.com/en-us/windows/win32/learnwin32/closing-the-window
https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-destroy
'개발 > Windows' 카테고리의 다른 글
[WinUI3] WinUI3 써먹을 수 있을까? (0) | 2024.05.26 |
---|---|
[Win32] 메시지 루프는 어떻게 창에 메시지를 전달할까? (0) | 2022.07.31 |
HIWORD, LOWORD 매크로, DWORD 쪼개기 (0) | 2022.06.16 |
리소스 문자열을 CString으로 불러오는 법 (win32,mfc) (0) | 2022.03.02 |
OpenJDK 다운로드 , 마이크로소프트에서 받자. (0) | 2022.02.25 |
댓글