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) ;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