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
Все