WindowEvent()
Syntax
Ereignis = WindowEvent()Beschreibung
Überprüft, ob in irgendeinem der geöffneten Fenster ein Ereignis stattfand.
Parameter
Diese Funktion hat keine Parameter.
Rückgabewert
Das nächste Ereignis aus dem "Ereignis-Queue" (Warteschlange mit Ereignissen) zurück bzw. Null, wenn es keine weiteren Ereignisse gibt. Anders als WaitWindowEvent() wartet die Funktion nicht auf das nächste Ereignis - sie kehrt immer sofort zurück. Event() kann verwendet werden, um diesen Wert "wiederherzustellen".
Dies macht sie nützlich für Ereignisschleifen von Fenstern, wo - ohne dass ein Ereignis auftritt (z.B. bei Network Transaktionen) - andere Prozesse ausgeführt werden müssen und daher WaitWindowEvent() nicht verwendet werden kann.
Sie muss mit Vorsicht benutzt werden, da sie bei fortlaufender Verwendung - anders als WaitWindowEvent() - anderen Programmen während des Wartens auf ein Ereignis keine Rechenzeit zur Verfügung stellt und damit alle CPU-Power verbraucht. In diesem Fall sollte innerhalb der Schleife entweder Delay() oder WaitWindowEvent() mit einem niedrigen Timeout-Wert verwendet werden.
Um die Fenster-Nummer, in dem das Ereignis stattfand, bestimmen zu können, müssen Sie die EventWindow() Funktion benutzen.
Mögliche Ereignisse sind:#PB_Event_Menu : ein Menü wurde ausgewählt #PB_Event_Gadget : ein Gadget wurde gedrückt #PB_Event_SysTray : ein Icon im Systray wurde angeklickt #PB_Event_Timer : ein Timer hat seine Zeitbeschränkung (Timeout) erreicht #PB_Event_CloseWindow : das Schließgadget vom Fenster wurde gedrückt #PB_Event_Repaint : der Fensterinhalt wurde zerstört und muss neu gezeichnet werden (nützlich für 2D Grafik-Operationen) #PB_Event_SizeWindow : das Fenster wurde in der Größe verändert #PB_Event_MoveWindow : das Fenster wurde verschoben #PB_Event_MinimizeWindow : das Fenster wurde minimiert #PB_Event_MaximizeWindow : das Fenster wurde maximiert #PB_Event_RestoreWindow : das Fenster wurde auf die normale Größe zurückgesetzt (sowohl von der minimalen als auch maximalen Größe) #PB_Event_ActivateWindow : das Fenster wurde aktiviert (hat den Fokus erhalten) #PB_Event_DeactivateWindow: das Fenster wurde deaktiviert (hat den Fokus verloren) #PB_Event_WindowDrop : eine Drag & Drop Operation wurde auf einem Fenster abgeschlossen #PB_Event_GadgetDrop : eine Drag & Drop Operation wurde auf einem Gadget abgeschlossen #PB_Event_RightClick : ein rechter Mausklick hat auf dem Fenster stattgefunden. Dies kann nützlich sein, um ein Popup-Menü anzuzeigen. #PB_Event_LeftClick : ein linker Mausklick hat auf dem Fenster stattgefunden #PB_Event_LeftDoubleClick : ein linker Maus-Doppelklick hat auf dem Fenster stattgefundenEin einfaches Beispiel zum Event-Handling finden Sie in der WaitWindowEvent() Beschreibung.
Anmerkungen
Nach einem #PB_Event_WindowDrop oder #PB_Event_GadgetDrop Ereignis können die Ereignis-Funktionen der Drag & Drop Library verwendet werden, um die abgelegten ("dropped") Daten zu untersuchen und zu lesen.
Wichtig: Eine Fenster-Ereignisschleife sollte nicht in einem Thread verarbeitet werden, da es auf OS X und Linux einige Einschränkungen gibt. Ein Debugger-Fehler wird ausgelöst.
Der beste Weg zum Handhaben einer WindowEvent()-Schleife sieht wie folgt aus:Repeat Event = WindowEvent() If Event ; ein Ereignis befindet sich in der "Queue" (Warteschlange), also arbeiten wir es ab .... Else Delay(1) ; kein Ereignis aufgetreten, lassen wir also anderen Programmen auch etwas CPU-Zeit zukommen! EndIf Until Event = #PB_Event_CloseWindowWichtig: Das 'Delay' sollte nicht nach jedem Ereignis eingefügt werden, denn wenn viele Ereignisse (wie Refresh, Gagdget Updates, etc.) auftreten, wird die Anwendung zwischen jedem Ereignis warten. Deshalb muss das Delay dann eingefügt werden, wenn keine Ereignisse empfangen werden. Andere (empfohlene) Möglichkeiten, bestehen darin, WaitWindowEvent() mit einem niedrigen Timeout-Wert zu verwenden oder einen Timer mittels AddWindowTimer()() zu definieren.
Wichtig: Wenn Sie irgendwo ein FlipBuffers() in Ihrem Code verwenden, dann ist das 'Delay(1)' nicht notwendig.
Beispiel: Nr. 1 mit Gadget
If OpenWindow(0, 0, 0, 600, 100, "Position of the mouse on the window: ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) TextGadget(0, 10, 6, 200, 20, "") Repeat Event = WindowEvent() If Event <> 0 ; Alle Ereignisse werden behandelt, so dass wir die Koordinaten der Maus anzeigen können SetWindowTitle(0, "Position of the mouse on the window: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseX(0))) Else Delay(1) ; Ohne ein FlipBuffers(), Delay() gibt die CPU für das Multitasking frei EndIf Until Event = #PB_Event_CloseWindow EndIf
Beispiel: Nr. 2 mit Gadget
If OpenWindow(0, 0, 0, 300, 30, "Position of the mouse on the desktop", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) TextGadget(0, 10, 6, 200, 20, "") Repeat Event = WindowEvent() If Event = 0 ; Keine Ereignisse in der Warteschlange mehr, damit können wir die Koordinaten der Maus anzeigen SetGadgetText(0, "Coordinates: "+Str(DesktopMouseX())+","+Str(DesktopMouseY())) EndIf Delay(20) ; Ohne ein FlipBuffers(), Delay() gibt die CPU für das Multitasking frei Until Event = #PB_Event_CloseWindow EndIf
Beispiel: Ohne Gadgets (allgemeiner Fall)
;Einige Variablen BallX = 400 BallY = 200 BallSpeedY.f = 5 Gravitation.f = 2 ;Initialisierung If InitSprite() InitKeyboard() InitMouse() EndIf ;Fenster OpenWindow(0, 0, 0, 800, 600, "WindowEvent", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) OpenWindowedScreen(WindowID(0), 0, 0, 800, 600) ;Hintergrund Ground = CreateSprite(#PB_Any, 800, 30) StartDrawing(SpriteOutput(Ground)) Box(0,0,800,30,RGB(128, 0, 0)) StopDrawing() ;Ball 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() ;Erstelle eines Sprites Image = CreateImage(#PB_Any, 8, 8, 24, RGB(255, 255, 255)) *Buffer=EncodeImage(Image ,#PB_ImagePlugin_BMP) Gauge = CatchSprite(#PB_Any, *Buffer) ;Hauptschleife Repeat Repeat ;Fenster-Ereignisse ;==================================== ;Versuche alle Möglichkeiten, aber nur eine zu einem Zeitpunkt Event = WindowEvent() ; Animation ;Event = WaitWindowEvent() ; Animation wird blockiert ;Event = WaitWindowEvent(1) ; Animation, aber einer 1ms langen unnötigen Verzögerung; und darüber hinaus ist es ein ; schlechter Weg, um Ereignisse zu programmieren, weil die Warteschlange nicht leer ist Select Event Case #PB_Event_CloseWindow End EndSelect Until Event=0 FlipBuffers() ; ==> Mit WindowEvent(), FlipBuffers() gibt die CPU für das Multitasking frei, so dass Delay(1) ; nicht erforderlich ist. ClearScreen(RGB(135, 206, 235)) ExamineKeyboard() ;Keyboard DisplaySprite(Gauge, 50, 570-BallY) ;Anzeige des Sprites ZoomSprite(Gauge, 20, 570) DisplaySprite(Ground, 0, 570) ;Anzeige des Hintergrunds DisplaySprite(Ball, BallX, BallY) ;Anzeigen des Balls ;Ball-Bewegung BallSpeedY = BallSpeedY + Gravitation BallY = BallY + BallSpeedY ;Management der Kollision der Kugel mit dem Boden If SpriteCollision(Ball, BallX, BallY+16, Ground, 0, 570) BallY= 554 BallSpeedY = -BallSpeedY EndIf Until KeyboardPushed(#PB_Key_Escape)
Siehe auch
WaitWindowEvent(), Event(), EventWindow(), EventGadget(), EventMenu(), EventTimer(), EventData(), EventType(), PostEvent(), BindEvent(), UnbindEvent()
Unterstützte OS
Alle