I was wondering what the difference between the WM_QUIT, WM_CLOSE, and WM_DESTROY messages in a windows program, essentially: when are they sent, and do they have any automatic effects besides what's defined by the program?
They are totally different.
WM_CLOSE
is sent to the window when it is being closed - when its "X" button is clicked, or "Close" is chosen from the window's menu, or Alt-F4 is pressed while the window has focus, etc. If you catch this message, this is your decision how to treat it - ignore it, or really close the window. By default, WM_CLOSE
passed to DefWindowProc()
causes the window to be destroyed.
WM_DESTROY
is sent to the window when it starts to be destroyed. In this stage, in opposition to WM_CLOSE
, you cannot stop the process, you can only make any necessary cleanup. When you catch WM_DESTROY
, none of its child windows have been destroyed yet.
WM_NCDESTROY
is sent to the window when it is finishing being destroyed. All of its child windows have been destroyed by this time.
WM_QUIT
is not related to any window (the hwnd
got from GetMessage()
is NULL, and no window procedure is called). This message indicates that the message loop should be stopped and the application should exit. When GetMessage()
reads WM_QUIT
, it returns 0 to indicate that. Take a look at a typical message loop snippet - the loop is continued while GetMessage()
returns non-zero.
WM_QUIT
can be sent by the PostQuitMessage()
function. This function is usually called when the main window receives WM_DESTROY
(see a typical window procedure snippet).