PureBasic

WaitWindowEvent()

Синтаксис

Event = WaitWindowEvent([Timeout])

Описание


Ожидает событие. Это такая же функция, как WindowEvent(), но она останавливает выполнение программы (это процессорное время отдаётся другим задачам), что очень важно в условиях многозадачности.

Параметры

Timeout (дополн.) Время ожидания (в миллисекундах), по истечении которого функция будет возвращена, даже если не произойдет никакого события. Если тайм-аут не указан, функция будет бесконечно ждать до тех пор, пока не произойдет событие.

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

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

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

 

Комментарии

Приложение должно всегда использовать эту функцию вместо WindowEvent(), если это возможно, так как она не занимает процессорное время во время ожидания события.

Цикл событий окна не должен обрабатываться в потоке, так как существует некоторое ограничение в OS X и Linux. Отладчик выдаст ошибку.

Функцию WaitWindowEvent() можно вызывать лишь один раз за итерацию цикла обработки событий, потому что иначе события будут "теряться" (каждое событие можно обработать лишь один раз и для повторной обработки оно не доступно).

Пример: общий случай

  If OpenWindow(0, 0, 0, 230, 90, "Пример обработки событий...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

   ButtonGadget  (1, 10, 10, 200, 20, "Кликни меня")
   CheckBoxGadget(2, 10, 40, 200, 20, "Отметь меня")

   If CreateMenu(0, WindowID(0))
     MenuTitle("Меню")
     MenuItem(1, "Элемент 1")
     MenuItem(2, "Элемент 2")
     MenuItem(3, "Элемент 3")
   EndIf

   Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Кнопка 1 кликнута!"
           Case 2 : Debug "Чек-бокс кликнут!"
         EndSelect
       
       Case #PB_Event_Menu
         Select EventMenu()
           Case 1 : Debug "Элемент меню 1 кликнут!"
           Case 2 : Debug "Элемент меню 2 кликнут!"
           Case 3 : Debug "Элемент меню 3 кликнут!"
         EndSelect
     
     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf

Пример: с использованием встроенного таймера в WaitWindowEvent

If OpenWindow(0, 0, 0, 300, 30, "Позиция мыши на рабочем столе", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")

    Repeat
        Event = WaitWindowEvent(20)

        If Event = 0 ; Больше нет событий в очереди, поэтому мы можем видеть координаты мыши
            SetGadgetText(0, "Координаты: " + Str(DesktopMouseX()) + "," + Str(DesktopMouseY()))
        EndIf

    Until Event = #PB_Event_CloseWindow
EndIf

Пример: с применением таймера Окна

If OpenWindow(0, 0, 0, 300, 30, "Позиция мыши на рабочем столе", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")
    AddWindowTimer(0, 0, 10) ; Timeout для таймера Окна = 10 ms

    Repeat
        Event = WaitWindowEvent()
        If Event = #PB_Event_Timer ; Каждые 10 мс => Покажем координаты
            SetGadgetText(0, "Координаты: " + Str(DesktopMouseX()) + "," + Str(DesktopMouseY()))
        EndIf

    Until Event = #PB_Event_CloseWindow
EndIf

См. также

WindowEvent(), Event(), EventWindow(), EventGadget(), EventMenu(), EventTimer(), EventData(), EventType(), PostEvent(), BindEvent(), UnbindEvent()

Поддерживаемые OS

Все

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