WindowEvent()
Синтаксис
Event = WindowEvent()
Описание
Проверяет, произошло ли событие в каком нибудь из открытых окон.
Параметры
Ничего.
Возвращаемое значение
Возвращает следующее событие в очереди событий, или ноль, если больше событий нет. В отличие от WaitWindowEvent() она не ждет следующего события, а всегда возвращает немедленно. Чтобы вернуть это значение, можно использовать функцию Event()Основной пример обработки событий можно найти в описании WaitWindowEvent().
Это делает функцию WindowEvent() очень полезной для циклов обработки событий Окон, особенно там, где необходимо выполнять другую работу не дожидаясь возникновения события (например, выполнять Сетевые транзакции). В таких случаях функция WaitWindowEvent() не может использоваться.
Функцию WindowEvent() нужно использовать с осторожностью, поскольку в отличии от WaitWindowEvent(), она не выделяет процессорное время другим программам при ожидании события, поэтому использует всю доступную мощность CPU. В этом случае нужно применять Delay(), встраивая задержку где-нибудь в цикле или использовать WaitWindowEvent() с минимальным значением таймера.
Чтобы получить идентификационный Номер (#Window) Окна, в котором произошло событие, используйте функцию EventWindow().
Возможные События:#PB_Event_Menu : Было выбрано Меню. #PB_Event_Gadget : Был нажат Гаджет. #PB_Event_SysTray : Кликнут значок в области SysTray. #PB_Event_Timer : Таймер достиг установленного времени. #PB_Event_CloseWindow : Нажат значок закрытия Окна. #PB_Event_Repaint : Все или часть содержимого Окна было разрушено и нуждается в восстановлении (полезно для 2D Графики). #PB_Event_SizeWindow : Изменён размер Окна. #PB_Event_MoveWindow : Окно было перемещено. #PB_Event_MinimizeWindow : Окно было свёрнуто. #PB_Event_MaximizeWindow : Окно было развёрнуто. #PB_Event_RestoreWindow : Окно было восстановлено до нормальных размеров (из свёрнутого или развёрнутого состояния). #PB_Event_ActivateWindow : Окно было активировано (получило фокус). #PB_Event_DeactivateWindow: Окно было дезактивировано (потеряло фокус). #PB_Event_WindowDrop : Операция Drag & Drop (Перетаскивание мышью) была завершена над Окном. #PB_Event_GadgetDrop : Операция Drag & Drop (Перетаскивание мышью) была завершена над Гаджетом. #PB_Event_RightClick : В Окне произведён щелчок правой кнопкой мыши. Это может быть полезно для отображения всплывающего меню. #PB_Event_LeftClick : В Окне произведён щелчок левой кнопкой мыши. #PB_Event_LeftDoubleClick : В Окне произведён двойной-щелчок левой кнопкой мыши.
Комментарии
После события #PB_Event_WindowDrop или #PB_Event_GadgetDrop, могут использоваться функции обработки событий из библиотеки Drag & Drop.
Важно: Цикл событий окна не должен обрабатываться в потоке, так как существует некоторое ограничение в OS X и Linux. Отладчик выдаст ошибку.
Корректный способ обработки бесконечного цикла WindowEvent():Repeat Event = WindowEvent() If Event ; Событие было в очереди, поэтому обрабатываем его .... Else Delay(1) ; Нет событий, пусть другие приложения получат некоторое время процессора! EndIf Until Event = #PB_Event_CloseWindow
Важно: Команду 'Delay' не следует применять после каждого события, поскольку при возникновении большого количества событий (обновление Окна, обновления Гаджетов и т.д.) приложение будет ожидать указанное количество ms между каждым событиями, что сделает интерфейс очень медленным. Таким образом команду 'Delay' нужно использовать в случае не получения события (как показано выше в примере). Другие (рекомендуемые) способы - это использовать функцию WaitWindowEvent() с небольшим значением таймаута или настроить таймер с помощью функции AddWindowTimer().
Важно: Если Вы где-нибудь в Вашем коде используете функцию FlipBuffers(), то в команде 'Delay (1)' нет необходимости.
Пример: №1 С Гаджетом
If OpenWindow(0, 0, 0, 600, 100, "Позиция мыши в окне: ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) TextGadget(0, 10, 6, 200, 20, "") Repeat Event = WindowEvent() If Event <> 0 ; Все события обрабатываются, чтобы мы могли видеть координаты мыши SetWindowTitle(0, "Позиция мыши в окне: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseX(0))) Else Delay(1) ; Без FlipBuffers() команда Delay() освобождает время CPU для поддержки многозадачности EndIf Until Event = #PB_Event_CloseWindow EndIf
Пример: №2 С Гаджетом
If OpenWindow(0, 0, 0, 300, 30, "Позиция мыши на рабочем столе", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) TextGadget(0, 10, 6, 200, 20, "") Repeat Event = WindowEvent() If Event = 0 ; Больше нет событий в очереди, поэтому мы можем видеть координаты мыши SetGadgetText(0, "Координаты: "+Str(DesktopMouseX())+","+Str(DesktopMouseY())) EndIf Delay(20) ; Без FlipBuffers() команда Delay() освобождает время CPU для поддержки многозадачности Until Event = #PB_Event_CloseWindow EndIf
Пример: без Гаджетов (общий случай)
; Немного переменных BallX = 400 BallY = 200 BallSpeedY.f = 5 Gravitation.f = 2 ; Инициализация If InitSprite() InitKeyboard() InitMouse() EndIf ; Окно OpenWindow(0, 0, 0, 800, 600, "WindowEvent", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) OpenWindowedScreen(WindowID(0), 0, 0, 800, 600) ; Земля Ground = CreateSprite(#PB_Any, 800, 30) StartDrawing(SpriteOutput(Ground)) Box(0, 0, 800, 30, RGB(128, 0, 0)) StopDrawing() ; Шар Ball = CreateSprite(#PB_Any, 16, 16) StartDrawing(SpriteOutput(Ball)) Box(0, 0, 16, 16, RGB(135, 206, 235)) Circle(8, 8, 8, RGB(255, 255, 0)) StopDrawing() ; Измерительный прибор Image = CreateImage(#PB_Any, 8, 8, 24, RGB(255, 255, 255)) *Buffer=EncodeImage(Image , #PB_ImagePlugin_BMP) Gauge = CatchSprite(#PB_Any, *Buffer) ; Главный цикл Repeat Repeat ; События Окна ;==================================== ;Попробуйте все возможности, но только по одному Event = WindowEvent() ; Анимация ;Event = WaitWindowEvent() ; Блокировка анимации ;Event = WaitWindowEvent(1) ; Анимация, но лишняя задержка в 1 мс, и, кроме того, ; это плохой способ программирования событий, потому что очередь не пуста Select Event Case #PB_Event_CloseWindow End EndSelect Until Event=0 FlipBuffers() ; WindowEvent() с помощью FlipBuffers() освобождает процессор для многозадачности, поэтому Delay(1) не требуется ClearScreen(RGB(135, 206, 235)) ExamineKeyboard() ;Keyboard DisplaySprite(Gauge, 50, 570-BallY) ; Отобразить измерительный прибор ZoomSprite(Gauge, 20, 570) DisplaySprite(Ground, 0, 570) ; Отобразить землю DisplaySprite(Ball, BallX, BallY) ; Отобразить шар ; Движение шара BallSpeedY = BallSpeedY + Gravitation BallY = BallY + BallSpeedY ; Управление столкновением шара с землей If SpriteCollision(Ball, BallX, BallY+16, Ground, 0, 570) BallY= 554 BallSpeedY = -BallSpeedY EndIf Until KeyboardPushed(#PB_Key_Escape)
См. также
WaitWindowEvent(), Event(), EventWindow(), EventGadget(), EventMenu(), EventTimer(), EventData(), EventType(), PostEvent(), BindEvent(), UnbindEvent()
Поддерживаемые OS
Все