problème gestion évènement dans boucle

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

problème gestion évènement dans boucle

Message par david »

bonjour à tous
je rappel avant toute chose que je suis débutant
je précise également que j'ai un peu honte de demander de l'aide pour ça parce que ça doit être trop trop simple et évident pour vous, mais là ça fait 8 jours que je teste tout ce que je peux et franchement j'en ai ras le bol

j'ai très simplifié mon code, pour ne laisser apparaître ce qui pêche
il est indispensable de ne pas apporter trop de modifications à la structure, car je risque d'avoir du mal à réintégrer tout ça à mon programme original au vu de mon niveau :lol:

Code : Tout sélectionner

 If OpenWindow(0, 50, 50, 260, 40, "#montexte1", #PB_Window_Normal    )
  ButtonGadget(0, 0, 0, 260, 40 ,"54545454") 

    Repeat 
      
      
      
 Select WaitWindowEvent(1) 
        
      Case #PB_Event_CloseWindow 
        End 
     
       Case #PB_Event_SysTray
         DisplayPopupMenu(1, WindowID(0))
         
      Case #PB_Event_Menu
      
      Select EventMenu()
        Case 1 ; Extraction Journal De Bord
          Debug "Extraction Journal De Bord"
        Case 2 ; Gestion du Temps
          Debug "Gestion du Temps"
        Case 3 ; A propos 
         Debug "A propos "
         
         
  
  
      EndSelect
      EndSelect

    
    
  ForEver 
EndIf 
bon on ne rigole pas svp (où allez si, ça fait tjs du bien. je serais content finalement si j'ai pu détendre quelques uns qui passaient une triste journée...)
il faut que j'intègre ce qui suit dans ma boucle pour pouvoir deplacer la fenetre quand on clic sur buttongadget et qu'on deplace la souris:

Code : Tout sélectionner

   Case 0
                         Select  EventType()
                           Case #PB_EventType_LeftButtonDown
                                   Test = 1
                                   MouseX1 = WindowX(#Main)
                                   MouseY1 = WindowY(#Main)
                                   MouseX2 = DesktopMouseX()
                                   MouseY2 = DesktopMouseY()
                                   DecalageX = MouseX2  - MouseX1
                                   DecalageY = MouseY2  - MouseY1         
                                   
                              Case #PB_EventType_MouseMove
                                   If Test = 1
                                        MouseX = DesktopMouseX()
                                        MouseY = DesktopMouseY() 
                                        x = MouseX - DecalageX
                                        y = MouseY - DecalageY
                                        ResizeWindow(#Main, x, y, #PB_Ignore, #PB_Ignore)
                                   EndIf
                                   
                              Case #PB_EventType_LeftButtonUp
                                   Test = 0 
                         EndSelect
le souscis c'est que je n'arrive pas gérer mes évènements correctement dans ma boucle alors ça coince
merci pour votre aide!!!

ps: je reprécise que je suis nul mais pas fénéant, et que j'ai bien cherché dans plein de bouts de codes ce qui sera pour vous une évidence puissance 10.000
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: problème gestion évènement dans boucle

Message par Marc56 »

il faut que j'intègre ce qui suit dans ma boucle pour pouvoir deplacer la fenetre quand on clic sur buttongadget et qu'on deplace la souris:
Ce n'est pas possible car le ButtonGadget ne supporte que l'event clic gauche
Essayes n'importe quel bouton souris sur le bouton (appuyé ou relaché) = 0

Code : Tout sélectionner

OpenWindow(0, 0, 0, 500, 300, "")
ButtonGadget(0, 10, 10, 100, 100, "Cliquer")

Repeat
     Select WaitWindowEvent()
               
          Case #PB_Event_CloseWindow 
               End
               
          Case #PB_Event_Gadget
               Debug "Event type: " + EventType()
               
     EndSelect
ForEver
#PB_EventType_LeftButtonDown fonctionne pour le gadget Canvas.
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: problème gestion évènement dans boucle

Message par david »

oui, merci
avec ton exemple je comprends bien qu'il sait quand on a cliqué et que si on maintien... ça pose problème

par contre j'avais trouvé ça sur le forum et sa serait un truc du genre que je voudrais faire:

Code : Tout sélectionner

Enumeration
     #Canvas
     #Button
     #Text
EndEnumeration

OpenWindow(0, 100, 100, 300, 100, "", #PB_Window_BorderLess | #PB_Window_BorderLess)
CanvasGadget(#Canvas, 0, 0, 300, 100)
ButtonGadget(#Button, 0,0,300,100, "Vous pouvez déplacer cet objet")





Repeat
  
  Select WaitWindowEvent(1)
          Case #PB_Event_Gadget
               Select EventGadget()
                    Case 0
                         Select  EventType()
                           Case #PB_EventType_LeftButtonDown
                                   Test = 1
                                   MouseX1 = WindowX(0)
                                   MouseY1 = WindowY(0)
                                   MouseX2 = DesktopMouseX()
                                   MouseY2 = DesktopMouseY()
                                   DecalageX = MouseX2  - MouseX1
                                   DecalageY = MouseY2  - MouseY1         
                                   
                              Case #PB_EventType_MouseMove
                                   If Test = 1
                                        MouseX = DesktopMouseX()
                                        MouseY = DesktopMouseY() 
                                        x = MouseX - DecalageX
                                        y = MouseY - DecalageY
                                        ResizeWindow(0, x, y, #PB_Ignore, #PB_Ignore)
                                   EndIf
                                   
                              Case #PB_EventType_LeftButtonUp
                                   Test = 0 
                         EndSelect
                         
                    Case #Button
                         Quit = 1
                         
               EndSelect
               
     EndSelect
Until Quit = 1
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: problème gestion évènement dans boucle

Message par microdevweb »

Bonjour David,

Je préfère perso utiliser les BindEvent et BindGadgetEvent qui facilite grandement la gestion des événements.

De plus avec les canvas on peut directement lire la position de la souris dans le canvas

Code : Tout sélectionner

GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX)
; Dans ton code avec WindowX ; tu relève la position de la fenêtre
Voici une petit code exemple

Code : Tout sélectionner

Enumeration 
  #Form
  #Canvas
  #Button
EndEnumeration
Procedure Exit()
  CloseWindow(#Form)
  End
EndProcedure
Procedure mesEvenementCanvas()
  Static MX,MY
  Select EventType()
    Case #PB_EventType_MouseMove
      MX=GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX)
      MY=GetGadgetAttribute(#Canvas,#PB_Canvas_MouseY)
      Debug "Position souris sur le canvas X: "+Str(MX)+" Y: "+Str(MY)
    Case #PB_EventType_LeftClick
      Debug "Vous avez cliquer en X: "+Str(MX)+" en Y: "+Str(MY)
  EndSelect
EndProcedure
Procedure mesEvenementBouton()
  Debug "Vous avez cliquer sur le bouton"
EndProcedure
OpenWindow(#Form,0,0,800,600,"teste",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CanvasGadget(#Canvas,0,0,800,540)
ButtonGadget(#Button,0,550,100,30,"Bouton")
; Gestion de sortie
BindEvent(#PB_Event_CloseWindow,@Exit(),#Form)
; Gestion des evénements sur le canvas
BindGadgetEvent(#Canvas,@mesEvenementCanvas())
; Gestion des evénements sur le bouton
BindGadgetEvent(#Button,@mesEvenementBouton())

Repeat
  WaitWindowEvent()
ForEver 


Dernière modification par microdevweb le jeu. 24/août/2017 11:55, modifié 2 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: problème gestion évènement dans boucle

Message par Marc56 »

La nouvelle option #PB_Canvas_Container permet de faire comme cela.

Change le début de ton code avec ceci:

Code : Tout sélectionner

OpenWindow(0, 100, 100, 300, 100, "", #PB_Window_BorderLess | #PB_Window_BorderLess)
CanvasGadget(#Canvas,  0,  0, 300, 100, #PB_Canvas_Container)
ButtonGadget(#Button, 50, 50, 200,  30, "Quitter")
Tu peux ainsi déplacer la fenêtre (hors clic sur le bouton)
(Il ne faut pas que le bouton recouvre entièrement le canvas, puisque c'est lui qui détecte la souris)

:wink:
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: problème gestion évènement dans boucle

Message par microdevweb »

@Marc56,

Oups je n'avais pas compris qu'il voulait déplacez une fenêtre
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: problème gestion évènement dans boucle

Message par Marc56 »

@microdevweb: pas grave, je lis aussi parfois (souvent & tout le temps) trop vite :)

@David: voici une version complète épurée et sécurisée (EnableExplicit etc)

Code : Tout sélectionner

EnableExplicit

Enumeration
     #Win
     #Canvas
     #Button
     #Text
EndEnumeration

OpenWindow(#Win, 100, 100, 300, 100, "", #PB_Window_BorderLess | #PB_Window_BorderLess)
CanvasGadget(#Canvas,  0,  0, 300, 100, #PB_Canvas_Container)
ButtonGadget(#Button, 50, 50, 200,  30, "Quitter")

Repeat
     Select WaitWindowEvent(1)
          Case #PB_Event_Gadget
               
               Select EventGadget()
                    Case #Canvas
                         
                         Select EventType()    
                                   
                              Case #PB_EventType_LeftButtonDown
                                   Define MouseDown = 1
                                   Define DecalageX = DesktopMouseX() - WindowX(0)
                                   Define DecalageY = DesktopMouseY() - WindowY(0)
                                   
                              Case #PB_EventType_MouseMove
                                   If MouseDown
                                        ResizeWindow(#Win, 
                                                     DesktopMouseX() - DecalageX, 
                                                     DesktopMouseY() - DecalageY,
                                                     #PB_Ignore, #PB_Ignore)
                                   EndIf
                                   
                              Case #PB_EventType_LeftButtonUp
                                   MouseDown = 0
                                   
                         EndSelect
                         
                    Case #Button
                         Define Quit = 1   
                         
               EndSelect     
     EndSelect
Until Quit = 1 
:idea: Évite d'utiliser des ID numérique pour les gadgets, c'est source d'erreurs difficiles à trouver.
Par exemple un gadget non initialisé donnera 0 aussi
J'ai remplacé ton ID 0 pour la fenêtre principale par #Win.

:idea: Quand le résultat d'une fonction n'est utilisée qu'une seule fois, autant la mettre dans la formule

:idea: Pour les longues lignes, ajouter des sauts de lignes (après les , ou +) cela permet de débbuger plus facilement car le debug n'indique d'habitude que la ligne.

:idea: Utiliser dès qu'on peut les raccourcis intéressants du langage
Ex: - If MouseDown <> 0 - peut se simplifier par - If MouseDown -
Car cela signifie que la valeur est différente de la valeur d'initialisation (0)

:idea: Toujours mettre EnableExplicit même pour les petits codes

:idea: Faire CTRL + a puis CTRL + i avant de lancer (permet de vérifier par l'indentation que les boucles sont OK)

:wink:
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: problème gestion évènement dans boucle

Message par david »

ouah...
un grand merci à tout le monde, autant pour les pistes et solutions que pour les conseils sur la manière de faire
il y a encore beaucoup de choses que je ne maîtrise pas, ça va me permettre d'explorer tout ça...
Répondre