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