394 Глава 16. Создание Windows-приложений на ассемблере
же к синхронным и асинхронным сообщениям мы еще вернемся, поэтому при-
мите пока все сказанное здесь на веру.
Переместите теперь строки 189-205 (при этом именно переместите их, а не про-
сто скопируйте) из функции WindowProc, разместив их сразу за вызовом функции
ShowWindowA (перед
Перетранслируйте заново исходный текст
приложения, получите новый вариант исполняемого модуля и запустите его. По-
ведение программы несколько изменилось. Файл create.wav воспроизведен, как
обычно — после создания окна. Далее последовательно появились окно приложе-
ния и долгожданное сообщение в его области. И лишь после этого был воспроиз-
веден звуковой файл
Поведение приложения для этого варианта разме-
щения фрагментов кода приводит к новым выводам.
и Функции Win32 API, выводящие что-либо в окно, должны размещаться после
функций, реализующих действия по отображению окна.
Приложение должно самостоятельно следить за актуальностью содержимого
своего окна.
Весь вывод на экран должен производиться в оконной функции.
Подтвердим правильность этих выводов следующими рассуждениями и экспе-
риментами. Сверните и вновь разверните окно приложения. Вы увидите, что об-
ласть окна вновь стала пустой, но при этом был воспроизведен звуковой файл
create.wav. Исходя из того, что строки кода, воспроизводящие этот файл, находят-
ся в оконной функции в том месте, где обрабатывается сообщение
при-
ходим к выводу — в очереди сообщений вновь оказалось это сообщение, и именно
оно было обработано оконной функцией. Как сообщение
оказалось
в очереди, если наше приложение на этот раз его туда не помещало, а сообщения
WM_PAINT от ShowWindowA и UpdateWindowA к этому моменту уже обработаны и управ-
ление передано циклу обработки сообщений? Ответ напрашивается сам собой: это
делает сама система Windows, именно она рассылает в очереди сообщений всех
приложений, окна которых отображены на экране, сообщение WM_PAINT. Но при
этом Windows не берет на себя обязанность хранить содержимое этих окон. За
актуальность содержимого окна должно отвечать само приложение. Сообщение
WM_PAINT служит для приложения сигналом обновить либо заново восстановить
содержимое своего окна. Следовательно, если мы хотим, чтобы результаты
предыдущих выводов на экран были актуальны, необходимо после получения со-
общения
перерисовать содержимое окна приложения. Последнее рас-
суждение доказывает тезис о том, что весь вывод на экран должен производиться
в оконной функции как реакция на поступление сообщения WM_PAINT.
Эти рассуждения показывают роль сообщений (и не только WM_PAINT), цирку-
лирующих в системе. Теперь, понимая всю их важность, можно приступить к рас-
смотрению следующей важной части оконного
При этом
мы продолжим манипулировать фрагментами нашего программного кода (на этот
раз звуковыми) для пояснения некоторых характерных моментов.
Do'stlaringiz bilan baham: