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) 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 Ereignis-Warteschlangen 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 Warteschlange 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 stattgefunden
Ein 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-Ereignis-Warteschlange 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()-Warteschlange 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_CloseWindow
Wichtig: 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

<- WindowBounds() - Window Inhaltsverzeichnis - WindowHeight() ->