В чем разница между WM QUIT, WM CLOSE и WM DESTROY в программе windows?


Мне было интересно, в чем разница между сообщениями WM_QUIT, WM_CLOSE и WM_DESTROY в программе windows, по существу: когда они отправляются, и есть ли у них какие-либо автоматические эффекты, кроме того, что определено программой?

4 58

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