Подтвердить что ты не робот

В чем разница между WM_QUIT, WM_CLOSE и WM_DESTROY в программе Windows?

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

4b9b3361

Ответ 1

Они совершенно разные.

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 (см. типичный фрагмент процедуры окна).

Ответ 2

Прежде всего, WM_CLOSE и WM_DESTROY сообщения связаны с конкретными окнами, тогда как сообщение WM_QUIT применимо ко всему приложению (поток скважины), и сообщение никогда не получается через окно процедуры (WndProc), но только через функции GetMessage или PeekMessage.

В вашей подпрограмме WndProc функция DefWindowProc выполняет по умолчанию поведение этих сообщений. WM_CLOSE сообщает о том, что приложение должно закрыть, а поведение по умолчанию для этого - вызвать функцию DestroyWindow. Его когда эта функция DestroyWindow вызывается, что отправляется сообщение WM_DESTROY. Обратите внимание, что WM_CLOSE - это только сообщение с просьбой закрыть (например WM_QUIT) - вам действительно не нужно выходить/выходить. Но сообщение WM_DESTROY сообщает, что ваше окно IS закрывается и уничтожается, поэтому вы должны очищать любые ресурсы, обрабатывать и т.д..

Ответ 3

Сначала обсудим WM_QUIT - отличие от других сообщений, которые не связаны с окном. Он используется приложением. Например, это может обрабатываться невидимым автономным OLE-сервером (.exe, но не в-proc как .dll)

WM_CLOSE - за msdn: "Приложение может запросить у пользователя подтверждение до уничтожения окна" - оно используется как уведомление о намерении закрыть (вы можете отклонить это намерение).

WM_DESTROY - факт, что окно закрывается, и все ресурсы должны (!) освобождаться.

Ответ 4

Просто чтобы он не заблудился в комментариях... не забывайте о WM_CANCEL. Когда вы нажимаете кнопку закрытия (x) в диалоговом окне MFC, она обязательно отправит WM_CLOSE. Функция OnClose() по умолчанию вызовет функцию по умолчанию (базовый класс) OnCancel().

Однако, если вы просто наберете ключ ESC, это приведет к закрытию диалогового окна, но (насколько я могу судить) без генерации события WM_CLOSE - он переходит непосредственно к WM_CANCEL/OnCancel() механизм.

Настоящим я предлагаю сообществу разобраться в этом... или отредактировать эту разработку в принятом ответе.