В чем разница между 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-это факт, что окно закрывается и все ресурсы должны(!) быть освобожденным.