Каково различие между WM_QUIT, WM_CLOSE и WM_DESTROY в Windows-программе?

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

62
задан 1 July 2010 в 07:24
поделиться

3 ответа

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

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

80
ответ дан 24 November 2019 в 16:49
поделиться

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

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

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

2
ответ дан 24 November 2019 в 16:49
поделиться

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

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

10
ответ дан 24 November 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: