WindowEvent()

Syntaxe

Resultat = WindowEvent()
Description
Teste si un évènement s'est produit sur chacune des fenêtres ouvertes.

Arguments

Aucun.

Valeur de retour

Renvoie le prochain évènement de la file d'attente ou zéro s'il n'y a plus d'évènements.

Contrairement à la fonction WaitWindowEvent(), elle n'attend pas le prochain évènement et le renvoi est donc toujours immédiat. Cela peut être utile quand un traitement doit être fait sans attendre (par exemple une transaction réseau).

Event() peut être utilisé pour récupérer cette valeur.

Les évènements renvoyés sont :
  #PB_Event_Menu            : Un menu a été sélectionné
  #PB_Event_Gadget          : Un gadget a été cliqué
  #PB_Event_SysTray         : Une icône dans la zone SysTray a été cliquée 
  #PB_Event_Timer           : Le temps d'un minuteur s'est écoulé
  #PB_Event_CloseWindow     : L'icône de fermeture de fenêtre a été cliquée
  #PB_Event_Repaint         : Tout ou partie du contenu de la fenêtre a été détruit et doit être reconstitué 
                              (Utile pour les applications graphiques 2D)
  #PB_Event_SizeWindow      : La fenêtre a été redimensionnée  
  #PB_Event_MoveWindow      : La fenêtre a été déplacée
  #PB_Event_MinimizeWindow  : La fenêtre a été minimisée
  #PB_Event_MaximizeWindow  : La fenêtre a été maximisée
  #PB_Event_RestoreWindow   : La fenêtre a été restaurée à sa taille normale
  #PB_Event_ActivateWindow  : La fenêtre a été activée (gain du focus)
  #PB_Event_DeactivateWindow: La fenêtre a été désactivée (perte du focus)
  #PB_Event_LeftDoubleClick : Un double clic gauche de la souris s'est produit sur la fenêtre
  #PB_Event_LeftClick       : Un clic gauche de la souris s'est produit sur la fenêtre
  #PB_Event_RightClick      : Un clic droit de la souris s'est produit sur la fenêtre. Cela peut être utile pour afficher un menu contextuel
  #PB_Event_WindowDrop      : Une opération Glisser & Déposer s'est terminée sur une fenêtre (Voir remarque ci-dessous)
  #PB_Event_GadgetDrop      : Une opération Glisser & Déposer s'est terminée sur un gadget (Voir remarque ci-dessous)

Vous trouverez un exemple dans la description de WaitWindowEvent().

Remarques

Remarque importante n° 1: Comme cette commande n'est pas bloquante, elle peut consommer beaucoup de temps processeur quand elle est dans une boucle d'attente. Dans ce cas, utilisez la commande Delay(), sauf en présence de la fonction FlipBuffers(), ou mieux, il est préférable d'utiliser la commande WaitWindowEvent() avec une petite valeur de minuteur (timeout), comme par exemple 'WaitWindowEvent(1)'.

Remarque importante n° 2: La boucle d'évènements de la fenêtre ne doit pas être traitée dans un thread, car il y a une limitation sur OS X et Linux. Une erreur du débogueur sera levée.

Pour obtenir le numéro de la fenêtre dans laquelle s'est produit l'évènement, utilisez la fonction EventWindow().

Après un évènement #PB_Event_WindowDrop ou #PB_Event_GadgetDrop, les fonctions de la bibliothèque Drag & Drop peuvent être utilisées pour examiner et lire les données déposées.

Si votre code n'utilise pas la commande FlipBuffers() et si la fonction 'WaitWindowEvent(1) ne convient pas alors la boucle WindowEvent() doit respecter la structure suivante:
  Repeat 
    Event = WindowEvent() 

    If Event    ; Un évènement est dans la file d'attente, il faut le gérer.
      .... 
    Else  
      Delay(1)  ; Plus d'évènements dans la file d'attente, laissons du temps processeur aux autres applications ! 
    EndIf 
  Until Event = #PB_Event_CloseWindow
Important: Le délai ne doit pas être spécifié après chaque évènement, car quand il y a de nombreux évènements dans la file d'attente (lors d'un rafraîchissement de fenêtre, de gadgets etc..) l'application attendra 1 ms entre chaque évènement ce qui rendra l'affichage très lent. Le délai est utile uniquement quand il n'y a plus d'évènement dans la file d'attente (donc quand WindowEvent() renvoie 0). Une autre façon de procéder est d'utiliser les 'timers' avec WaitWindowEvent(1) ou d'en créer un avec AddWindowTimer().

Exemple: Avec Gadget

    If OpenWindow(0, 0, 0, 600, 100, "Position de la souris sur la fenêtre: ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")
    
    Repeat
      Event = WindowEvent()
      
      If Event <> 0 ; Tous les évènements sont traités
        SetWindowTitle(0, "Position de la souris sur la fenêtre: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseX(0))) 
      Else
      
      Delay(1) ; En absence de FlipBuffers(), Delay() libére le processeur 
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf

Exemple: Avec Gadget (Variante)

  If OpenWindow(0, 0, 0, 300, 30, "Position de la souris sur le bureau", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")
    
    Repeat
      Event = WindowEvent()
      
      If Event = 0 ; Il n'y a plus d'évènement dans la file d'attente
        SetGadgetText(0, "Coordonnées : "+Str(DesktopMouseX())+","+Str(DesktopMouseY()))
      EndIf
      
      Delay(20) ; En absence de FlipBuffers(), Delay() libére le processeur pour le multi-tâche
      
    Until Event = #PB_Event_CloseWindow
  EndIf

Exemple: Sans Gadgets

  ;Quelques variables
  BalleX = 400
  BalleY = 200
  BalleVitesseY.f = 5
  Gravitation.f = 2

  ;Initialisation 
  If InitSprite()
    InitKeyboard()
    InitMouse()
  EndIf

  ;Création de la fenêtre
  OpenWindow(0, 0, 0, 800, 600, "WindowEvent", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)

  ;Création du sol
  Sol = CreateSprite(#PB_Any, 800, 30)
  StartDrawing(SpriteOutput(Sol))
  Box(0,0,800,30,RGB(128, 0, 0))
  StopDrawing()

  ;Création de la Balle
  Balle = CreateSprite(#PB_Any, 16, 16)
  StartDrawing(SpriteOutput(Balle))
  Box(0,0,16,16,RGB(135, 206, 235))
  Circle(8,8,8,RGB(255, 255, 0))
  StopDrawing()

  ;Création de la jauge
  Image = CreateImage(#PB_Any, 8, 8, 24, RGB(255, 255, 255))
  *Memoire=EncodeImage(Image ,#PB_ImagePlugin_BMP)
  Jauge = CatchSprite(#PB_Any, *Memoire)

  
  ;Boucle principale
  Repeat 
  
    Repeat
    ;Gestion des évènements de la fenêtre
    ;====================================
    ;Essayez les 3 possibilités mais une seule à la fois 
    Evenement = WindowEvent()    ; Animation
    ;Evenement = WaitWindowEvent()  ; Blocage de l'animation
    ;Evenement = WaitWindowEvent(1) ; Animation mais délai d'1 ms inutile et de plus c'est une mauvaise 
                                    ; façon de programmer car la pile des évènements n'est pas vidée

    Select Evenement   
      Case #PB_Event_CloseWindow
      End
    EndSelect 
    Until Evenement=0
    
    FlipBuffers() ; ==> Avec WindowEvent(), FlipBuffers() libère le processeur pour le multitâche et dispense d'un Delay(1)
    ClearScreen(RGB(135, 206, 235))
    
    ExamineKeyboard() ;Evènement clavier
     
    DisplaySprite(Jauge, 50, 570-BalleY) ;Affichage de la jauge
    ZoomSprite(Jauge,  20, 570)
     
    DisplaySprite(Sol, 0, 570) ;Affichage du sol
    
    DisplaySprite(Balle, BalleX, BalleY) ;Affichage de la Balle
    
    ;Mouvement de la Balle 
    BalleVitesseY = BalleVitesseY + Gravitation 
    BalleY = BalleY + BalleVitesseY
    
    ;Gestion de la collision de la balle avec le sol
    If SpriteCollision(Balle, BalleX, BalleY+16, Sol, 0, 570)
    BalleY= 554
    BalleVitesseY = -BalleVitesseY
    EndIf
    
  Until KeyboardPushed(#PB_Key_Escape)

Voir aussi

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

OS Supportés

Tous

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