관리 메뉴

드럼치는 프로그래머

[API/MFC] DestroyWindow와 PostQuitMessage 본문

★─Programing/☆─API | MFC

[API/MFC] DestroyWindow와 PostQuitMessage

드럼치는한동이 2011. 11. 1. 17:49
PostQuitMessage가 WM_QUIT를 Post하는 함수라고 했습니다...
WM_QUIT의 의미는 무엇입니까?...
메시지루프를 종료하게 해주지요...

GetMessage에서 WM_QUIT를 꺼내게 되면, 0을 반환하니,
그렇다면,
while( GetMesasge(...;))
{
}

하게 될때, WM_QUIT를 꺼내게 된다면,
조건식의 값이 0이므로 거짓으로 평가되어 루프를 탈출하게 되지요.

그리고 바로 Winmain함수의 return msg.wParam; 문장을 만나게 되고,
WinMain함수를 종료합니다.

왜 PostQuitMessage 를 바로 넣지 말라 하는 이유는,
종료 처리를 못하기 때문입니다....
WM_DESTROY메시지에 통상적으로 종료처리를 넣는데,...
PostQuitMessage함수는 WM_DESTROY고 뭐고 상관없이 메시지루프를 탈출시킵니다....
그렇게 프로그래머가 WM_DESTROY따위에 작성해 놓은 종료 처리도 제대로 못하게 될 뿐더러,
차일드 윈도우나, 이것저것 시스템이 알아서 파괴해 준다는 그러한 것들도
해제하지 못하므로, 결코 바람직하지 않지요....

그런것들을 해제하는 과정도 거치지 않았는데, 프로그램만 쏙 종료시키는거지요....
뭐, 그렇다고 Windows에서 일반적으로 큰 문제가 생기지는 않으나,
(물론 문제가 생기는 경우도 많습니다.)..
분명 바람직하지 못합니다!!.....

그리고 DestroyWindow와 PostQuitMessage의 역할이 중복된다고 하셨는데, 그렇지 않습니다.

DestroyWindow가
메뉴 파괴하고, 스레드 메시지 큐를 flush하고, 설치된 타이머를 제거하고, 클립보드 소유권도 없애고, 등등.. 이라고 나와 있는데,
별거 없어요..,,.
일축하자면, "파괴하고자 하는 윈도우에 연관된 모든 리소스를 먼저 제거 작업이죠."
메뉴? 대상 윈도우에 메뉴가 생성되어 있다면 파괴하는게 원칙이고..

스레드 메시지 큐를 flush한다는건, 제가 정확히 적는건지는 모르겟으나,
그 파괴하고자 하는 윈도우를 대상으로 보낸 메시지들이, 아직 메시지 큐에 남아있을수도 있습니다.
그런것들이 남아있는 상태로 윈도우만 쏙 파괴하면, 나중에 그 메시지들이 GetMessage로 꺼내지고
DispatchMessage함수가 메시지를 윈도우 프로시저로 전송을 시도하는데,
실제로는 파괴되어서, 무효한 윈도우 핸들을 대상으로 보내게 되는거지요..,,,.
분명 바람직하지 않아요.. 그래서 일단 큐에 남아있는 메시지들을 죄다 꺼내서 보내주겠지요..

또 그 외에 뭣뭣뭣 역할을 한다고 더 적혀 있는데,
다 대상 윈도우에 관련된 주변 리소스 따위를 먼저 해제하는 것이에요.,..
윈도우도 파괴하겠죠 뭐... 아 파괴하기 전에 WM_DESTROY따위도 보내줘야 하겠군요..
그래서 프로그래머가 작성한 종료루틴도 실행될 기회를 주지요.

DestroyWindow는 윈도우 파괴이고,
PostQuitMessage는 WM_QUIT을 메시지큐에 넣기만 합니다.
메시지 루프 탈출용이지요. 

Comments