Циклы сообщений Windows и WTL - PullRequest
1 голос
/ 01 марта 2011

Я пытаюсь понять, как работает WTL, и циклы сообщений смущают меня прямо сейчас.

Например, этот фрагмент кода: ссылка

Окносначала создается и после этого запускается насос сообщений.Как это работает?Разве CreateEx, UpdateWindow и т. Д. Не должны отправлять свои собственные невидимые сообщения, такие как WM_CREATE / WM_PAINT / WM_NCPAINT?Куда они выбрасываются, если насос сообщений не инициализирован?Что произойдет, если вы создаете окно, запускаете цикл обработки сообщений, затем закрываете окно, но хотите создать новое вместо него?PostQuit выходит из цикла, и вам нужно создать новый?

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Важно понимать разницу между отправкой сообщений (PostMessage) и отправкой сообщений (SendMessage). Windows вызывает оконную процедуру непосредственно для отправленных сообщений, они не отправляются циклом сообщений. Именно так WM_CREATE и WM_SHOWWINDOW могут быть обработаны до запуска цикла сообщений. WM_QUIT, WM_PAINT, WM_KEYDOWN и WM_MOUSEMOVE являются примерами сообщений, которые публикуются.

2 голосов
/ 01 марта 2011

Что касается отправки сообщения, CreateWindow отправляет сообщение напрямую, как если бы использовалось SendMessage.Если вы много программировали для Windows, вы, вероятно, отправляли сообщения элементам управления напрямую таким образом, и все происходило немедленно, без необходимости запуска насоса сообщений;Windows тоже сделает это сам.

Что касается проблемы PostQuitMessage, то обычной тактикой является выполнение какой-то другой проверки в цикле сообщений, чтобы увидеть, должно ли приложение выйти.Например, вместо публикации сообщения о выходе при закрытии окна и ожидания WM_QUIT в цикле сообщений, вы можете сохранить счетчик открытых окон, а затем просто выйти при наличии 0 открытых окон.

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

...