Обработка сообщений Windows
Введение
Сообщения для вашей программы будут отправлены Windows в очередь, которая обрабатывается, только по Вашему желанию. Windows отправляет тысячи сообщений в Вашу программу, и делает это незаметно.
Например, если Вы измените состояние Гаджета (нет разницы, добавляете ли Вы новую запись или изменяете изображение ImageGadget), сообщение будет отправлено в очередь вашей программы.
Есть две возможности получать и обрабатывать сообщения Windows в PureBasic: WaitWindowEvent() и WindowEvent(). Разница в том, что WaitWindowEvent() блокирует программу и ждет, пока не поступит сообщение, а WindowEvent() позволяет продолжить работу. Однако сообщения в очереди будут обрабатываться только после вызова WindowEvent() или WaitWindowEvent().
Особенности WindowEvent()
Команда WindowEvent() не ждет, пока поступит сообщение, а только проверяет, находится ли какое нибудь сообщение в очереди. Если да, то сообщение обрабатывается, и WindowEvent() возвращает Номер сообщения. Если нет никаких сообщений, возвращается ноль (0).
Пример
While WindowEvent() : Wend
Заставляет WindowEvent() вызываться до тех пор, пока функция не вернет 0, то есть до тех пор, пока все сообщения в очереди не будут обработаны.
Конец очереди не будет достигнут, если Вы просто поставите команду "WindowEvent()" после вызова SetGadgetState() для обработки конкретно этого сообщения. Во-первых, в очереди все еще могут быть другие сообщения, поступившие ранее, а во-вторых, Windows также отправляет довольно много других сообщений, которые нам не нужно обрабатывать... но которые, тем не менее, находятся в очереди.
Простой вызов не поможет, код работающий корректно в данных обстоятельствах в одной версии Windows, может не работать в другой версии. Различные версии Windows сильно отличаются друг от друга, поэтому одна версия отправляет только 1 сообщение, а другая версия Windows в тех же условиях отправляет 5.
Из-за этого, для обновления всегда использует :While WindowEvent() : Wend
Конечно, есть и альтернативаRepeat : Until WindowEvent() = 0
однако, это не совсем обычно.
Описанный метод While: WindowEvent(): Wend часто используется с командой Delay(), где цикл - вставляется ПЕРЕД Delay(), например, чтобы сначала дождаться обновления ImageGadget, после изменения изображения с помощью SetGadgetState().