Alexandr wrote:IvanF wrote:Alexandr wrote:
когда WM_CLOSE приходит, достаточно PostQuitMessage запулить и цикл завершится (так как WM_QUIT придет)
скорее всего автора спрашивали, как кнопку создать на главном окне, просто создать окно с именем класса BUTTON и в родителе нотификацию BN_CLICK (так кажется) обрабатывать
Откуда вы взяли что по WM_QUIT цикл обработки сообщений завершится? Это же ваше pure winapi приложение. Небудет в цикле обработки проверки на это и ничего не прервется. WM_QUIT это тоже обычное сообщение по которому ОБЫЧНО завершается цикл обработки. Но бывают ситуации когда нужно еще что то сделать и не завершать цикл по WM_QUIT. Поэтому правльнее говорить о том что приложение завершается при завершении главной функции, а не о каких то WM_QUIT и WM_CLOSE.
GetMessage возвращает 0, если WM_QUIT поймал, соответственно
while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) выходит из цикла

Правда что ли? Вот об этом я и говорил что все время. Вы заучили "while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)" и даже не понимаете что вызов GetMessage можно написать по другому. Я могу привести вам сотню вариантов кода с GetMessage которые НЕ прерывают никакого цикла. Например в одном из проектов я писал свой цикл обработки сообщений для консольного приложения, потоиму что мне нужна была очередь сообщений, но окон небыло. И там у меня небыло выхода по WM_QUIT, потому что я сам должен был контролировать выход их приложения.
Кроме того я же написал что "Небудет в цикле обработки проверки на это и ничего не прервется". Т.е. если в вашем коде убрать проверку результата GetMessage и никто никуда не выйдет. Так что WM_QUIT не прерывает цикл обработки сообщений автоматически. И еще раз повторю - программа завершается не на WM_QUIT или WM_CLOSE, а только когда главная функция завершится.
Более того. Даже в стандартных приложения после WM_QUIT приложение может жить бесконечно долго. Например если вызвать MessageBox уже после выхода из цикла обработки сообщений.
Так что еще раз повторяю ..нормально завершение приложения - это выход из главной функции. Ни WM_CLOSE ни WM_QUIT не являются завршением приложения. Это просто стандартные сообщения которые индицируют чье то желание завершить, но сами по себе не могут гарантировать, что это желание будет осуществленно.