В чем разница между WM QUIT, WM CLOSE и WM DESTROY в программе windows?
Мне было интересно, в чем разница между сообщениями WM_QUIT, WM_CLOSE и WM_DESTROY в программе windows, по существу: когда они отправляются, и имеют ли они какие-либо автоматические эффекты, кроме того, что определено программой?
4 ответов
они совершенно разные.
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
может быть отправлено
прежде всего,WM_CLOSE и сообщения wm_destroy сообщения связаны с конкретными окнами, тогда как WM_QUIT сообщение применимо ко всему приложению (ну поток), и сообщение никогда не принимается через процедуру окна (WndProc
routine), но только через GetMessage
или PeekMessage
функции.
в своем WndProc
режима DefWindowProc
функция заботится о поведении по умолчанию этих сообщений. Этот WM_CLOSE сообщения запрашивают, что приложение должно закрыть и по умолчанию behavoir для этого, чтобы вызвать сообщения wm_destroy сообщение говорит вам, что ваше окно IS будучи закрыт и уничтожен, поэтому вы должны очистить любые ресурсы, ручки и т. д.
просто, чтобы он не терялся в комментариях... не забывайте о WM_CANCEL
. Когда вы нажимаете кнопку Закрыть (x) в диалоговом окне MFC, он, безусловно, отправит WM_CLOSE
. Значение по умолчанию OnClose()
функция вызовет значение по умолчанию (базовый класс) .
однако, если вы просто введите ESC
ключ, это приведет к закрытию диалога, но (насколько я могу судить) без генерации WM_CLOSE
событие-оно переходит непосредственно в WM_CANCEL/OnCancel()
механизм.
настоящим я приглашаю сообщество подробнее остановиться на этом... или отредактируйте это уточнение в принятом ответе.
сначала обсудим WM_QUIT-отличие от других сообщений в том, что это не связано с окном. Он используется приложением. Например, это может быть обработано невидимым автономным Ole-сервером (.exe, но не в прок, как .dll файлы)
WM_CLOSE-на msdn:"приложение может запросить у пользователя подтверждение, прежде чем уничтожить окно" - это используется в качестве уведомления о намерении закрыть (вы можете отказаться от этого намерение.)
WM_DESTROY-это факт, что окно закрывается и все ресурсы должны(!) быть освобожденным.