PureBasic

WindowEvent()

Синтаксис

Event = WindowEvent()

Описание


Проверяет, произошло ли событие в каком нибудь из открытых окон.

Параметры

Ничего.

Возвращаемое значение

Возвращает следующее событие в очереди событий, или ноль, если больше событий нет. В отличие от WaitWindowEvent() она не ждет следующего события, а всегда возвращает немедленно. Чтобы вернуть это значение, можно использовать функцию Event()

Это делает функцию 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 : В Окне произведён двойной-щелчок левой кнопкой мыши.
  
Основной пример обработки событий можно найти в описании WaitWindowEvent().

Комментарии

После события #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

Все

<- WindowBounds() - Оглавление Window - WindowHeight()->