PureBasic

Обработка сообщений Windows

Введение

Сообщения для вашей программы будут отправлены Windows в очередь, которая обрабатывается, только по Вашему желанию. Windows отправляет тысячи сообщений в Вашу программу, и делает это незаметно.

Например, если Вы измените состояние Гаджета (нет разницы, добавляете ли Вы новую запись или изменяете изображение ImageGadget), сообщение будет отправлено в очередь вашей программы.

Есть две возможности получать и обрабатывать сообщения Windows в PureBasic: WaitWindowEvent() и WindowEvent(). Разница в том, что WaitWindowEvent() блокирует программу и ждет, пока не поступит сообщение, а WindowEvent() позволяет продолжить работу. Однако сообщения в очереди будут обрабатываться только после вызова WindowEvent() или WaitWindowEvent().

Особенности WindowEvent()

Команда WindowEvent() не ждет, пока поступит сообщение, а только проверяет, находится ли какое нибудь сообщение в очереди. Если да, то сообщение обрабатывается, и WindowEvent() возвращает Номер сообщения. Если нет никаких сообщений, возвращается ноль (0).

Пример

While WindowEvent() : Wend

Заставляет WindowEvent() вызываться до тех пор, пока функция не вернет 0, то есть до тех пор, пока все сообщения в очереди не будут обработаны.

Конец очереди не будет достигнут, если Вы просто поставите команду "WindowEvent()" после вызова SetGadgetState() для обработки конкретно этого сообщения. Во-первых, в очереди все еще могут быть другие сообщения, поступившие ранее, а во-вторых, Windows также отправляет довольно много других сообщений, которые нам не нужно обрабатывать... но которые, тем не менее, находятся в очереди.

Простой вызов

WindowEvent()

не поможет, код работающий корректно в данных обстоятельствах в одной версии Windows, может не работать в другой версии. Различные версии Windows сильно отличаются друг от друга, поэтому одна версия отправляет только 1 сообщение, а другая версия Windows в тех же условиях отправляет 5.

Из-за этого, для обновления всегда использует :

While WindowEvent() : Wend

Конечно, есть и альтернатива

Repeat : Until WindowEvent() = 0

однако, это не совсем обычно.

Описанный метод While: WindowEvent(): Wend часто используется с командой Delay(), где цикл - вставляется ПЕРЕД Delay(), например, чтобы сначала дождаться обновления ImageGadget, после изменения изображения с помощью SetGadgetState().