Я задавался вопросом, что различие между WM_QUIT, WM_CLOSE и WM_DESTROY передает в Windows-программе по существу: когда они отправляются, и они имеют какие-либо автоматические эффекты помимо того, что определяется программой?
Они совершенно разные.
WM_CLOSE
отправляется окну, когда нажимается «X» или «Закрыть» выбирается из меню окна. Если вы поймали это сообщение, это ваш призыв, как его лечить - игнорировать его или действительно закрыть окно. По умолчанию WM_CLOSE
, переданный в DefWindowProc
, вызывает уничтожение окна. Когда окно разрушается, отправляется сообщение WM_DESTROY
. На этом этапе, в отличие от WM_CLOSE
, вы не можете остановить процесс, вы можете только произвести необходимую очистку. Но помните, что когда вы перехватываете WM_DESTROY
непосредственно перед тем, как все дочерние окна уже уничтожены. WM_NCDESTROY
отправляется сразу после того, как все дочерние окна были уничтожены.
Сообщение WM_QUIT
не связано ни с каким окном ( hwnd
, полученный от GetMessage
, имеет значение NULL, и никакая оконная процедура не вызывается). Это сообщение указывает на то, что цикл сообщений должен быть остановлен, а приложение должно быть закрыто. Когда GetMessage
читает WM_QUIT
, он возвращает 0, чтобы указать на это. Взгляните на типичный фрагмент цикла сообщений - цикл продолжается, а GetMessage
возвращает ненулевое значение. WM_QUIT
может быть отправлен функцией PostQuitMessage
. Эта функция обычно вызывается, когда главное окно получает WM_DESTROY
(см. фрагмент типичной оконной процедуры ).
Сначала давайте обсудим WM_QUIT - отличие от других сообщений, которое не связано с окном. Используется приложением. Например, это может быть обработано невидимым автономным сервером OLE (.exe, но не внутри процесса, как .dll)
WM_CLOSE - per msdn: " Приложение может запрашивать у пользователя подтверждение перед удалением окно "- используется как уведомление о намерении закрыть (вы можете отклонить это намерение).
WM_DESTROY - это факт, что окно закрывается и все ресурсы должны (!) Быть освобождены.
Во-первых, сообщения WM_CLOSE и WM_DESTROY связаны с конкретными окнами, в то время как сообщение WM_QUIT относится ко всему приложению (ну потоку) и это сообщение никогда не принимается через оконную процедуру (рутина WndProc
), а только через функции GetMessage
или PeekMessage
.
В вашей WndProc
рутине функция DefWindowProc
позаботится о поведении этих сообщений по умолчанию. Сообщение WM_CLOSE запрашивает закрытие приложения, и стандартным поведением для этого является вызов функции DestroyWindow
. Именно после вызова этой функции DestroyWindow
отправляется сообщение WM_DESTROY. Обратите внимание, что WM_CLOSE - это только сообщение с запросом на закрытие (как WM_QUIT) - на самом деле вы не должны выходить/закрывать. Но сообщение WM_DESTROY говорит вам, что ваше окно ЕСТЬ закрывается и уничтожается, поэтому вы должны очистить все ресурсы, хэндлы и т.д.