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_CloseWindowImportant: 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)
SetFrameRate(30)
;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(100) ; Animation mais à chaque fois qu'un évènement apparait comme
; bouger la souris par exemple, l'animation sera suspendu 100 ms
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