Page 1 sur 1

Le WindowsEvent

Publié : jeu. 29/juin/2017 16:42
par SPH
Salut,
Les windowsevent sont nouveaux pour moi. J'aimerais interroger la souris pour que le "m" de Plot(x, y, RGB(m,m,m)) soit la coordonnée x de la souris.
Par exemple, en deplacant la souris a la coordonnée x = 20, le Plot(x, y, RGB(m,m,m)) soit egale a Plot(x, y, RGB(20,20,20)).
Je sais que tout se passe dans la boucle; mais quoi marquer, je n'en sais rien...

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "Plot Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      For x = 0 To 199
        For y = 0 To 199
          Plot(x, y, RGB(m,m,m))
        Next y
      Next x
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Re: Le WindowsEvent

Publié : jeu. 29/juin/2017 18:58
par JohnJohnsonSHERMAN
Il y a deux façons de procéder pour cela :
  • Avec la boucle d'événements
  • En utilisant BindEvent pour exécuter directement une procédure quand l'événement est déclenché
Je vais aborder uniquement la seconde, car c'est a mon gout bien plus lisible pour un petit code

Code : Tout sélectionner

Procedure DrawDesTrucs()
  
  Protected m = WindowMouseX(0) ; On récupére la coordonnée x de la souris ici
  
  StartDrawing(CanvasOutput(0))
  
  For x = 0 To 199
    For y = 0 To 199
      Plot(x, y, RGB(m,m,m))
    Next y
  Next x
  
  StopDrawing() 
  
EndProcedure



If OpenWindow(0, 0, 0, 200, 200, "Plot Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CanvasGadget(0, 0, 0, 200, 200)
  
  BindGadgetEvent(0, @DrawDesTrucs(), #PB_EventType_MouseMove) ; Quand l'événement de type MouseMove est déclenché, on exécute DrawDesTrucs()
  
  
  Repeat
    Event = WaitWindowEvent()
    
  Until Event = #PB_Event_CloseWindow
  
EndIf
On utilise BindGadgetEvent() pour lier une procédure au déclenchement d'un événement sur un gadget. Ca marche pour n'importe quel type d'event (déplacement de souris, clic, focus, etc...)
Au passage j'ai remplacé ton image + imagegadget par un Canvas qui offre l'avantage qu'on peut dessiner dessus directement :)
Et pis on peut toujours récupérer l'image qui s'y trouve avec GetGadgetState() 8)

L'avantage de BindEvent / BindGadgetEvent c'est que la procédure est directement et immédiatement invoquée lors de l'événement, il ne reste pas traîner dans une file d'events :) Et ca c'est pratique quand il y a par exemple des affichages à rafraîchir souvent

Voila ;)

Re: Le WindowsEvent

Publié : jeu. 29/juin/2017 19:42
par SPH
Merci 8O

il me faut un peu de temps pour digérer cette nouvelle approche

Re: Le WindowsEvent

Publié : ven. 30/juin/2017 9:26
par Marc56
En mode classique, ça peut se faire comme ça:

Code : Tout sélectionner

Repeat
     Event = WaitWindowEvent()
     If EventType() = #PB_EventType_MouseMove
          DrawDesTrucs()
     EndIf
Until Event = #PB_Event_CloseWindow
Mais tout mouvement de souris n'importe où déclenche DrawDesTrucs()

Si tu ne veux pas que le système se déclenche à chaque mouvement de souris,
mais uniquement au dessus du gadget concerné, il suffit de restreindre au gadget lui-même

Code : Tout sélectionner

     If EventGadget() = 0 And EventType() = #PB_EventType_MouseMove
          DrawDesTrucs()
     EndIf
Après, quand tu utilises plein de gadgets, il vaut mieux utiliser Select/EndSelect pour ne pas faire un tas de If inutiles.
Tu imbriques, selon la quantité d'options, Gadgets puis EventType ou l'inverse

Facile ?
:wink:

Re: Le WindowsEvent

Publié : ven. 30/juin/2017 9:51
par Zorro
si possible (et ça l'est)
arrêtez de poster des codes avec des id de gadget numérique ..

en plus vous prennez un malin plaisir à mettre des 0 partout ! (gadget ,Windows,sons,musique,image)

Mettez vous à la place d'un débutant qui ne peut pas comprendre à quoi correspond

Code : Tout sélectionner

 If EventGadget() = 0 

qui est ambiguë dans ce cas , puisque littéralement signifie
si eventgadget égale 0.....

alors que

Code : Tout sélectionner

 If EventGadget() = #bouton 

est quand même plus parlant ! non ?

en clair arrêtez de coder comme des gorets ! :lol:

d'ailleurs faudrait pour bien faire,revoir tout les exemples de la Doc...

Re: Le WindowsEvent

Publié : ven. 30/juin/2017 11:46
par JohnJohnsonSHERMAN
[12:45 - 30/06/17] flemme.exe a déclaré illégal le conseil de l'utilisateur Zorro

:mrgreen:

Re: Le WindowsEvent

Publié : ven. 30/juin/2017 15:40
par Ar-S
Je suis d'accord avec la mise en pratique des énumérations ou via des varibales= /#PB_Any
On a la chance de pouvoir coder en affichant clairement les gadgets, fenêtres, ce serait bien d'en profiter.
Bien sur si vous avez 250 sprites à afficher, inutile de les énumérer mais dans la cas de progs fenêtrés avec quelques gadgets c'est tout de même plus lisible.

@SPH.
Tu vois c'est pas dur le monde du fenêtré :mrgreen:

Re: Le WindowsEvent

Publié : ven. 30/juin/2017 22:22
par falsam
Par exemple, en deplacant la souris a la coordonnée x = 20, le Plot(x, y, RGB(m,m,m)) soit egale a Plot(x, y, RGB(20,20,20)).
Je me demande si c'est pas un peu crétin pour effet ?

Mais bon, pourquoi pas. :mrgreen:

La meilleurs méthode est de passer par le canvas qui est riche en fonctionnalités et en retour d’événements.

Code : Tout sélectionner

#PB_EventType_MouseEnter      : Le curseur de la souris est entré dans le gadget 
  #PB_EventType_MouseLeave      : Le curseur de la souris est sorti du gadget
  #PB_EventType_MouseMove       : Le curseur de la souris a bougé
  #PB_EventType_MouseWheel(*)   : La molette de la souris a bougé
  
  #PB_EventType_LeftButtonDown  : Le bouton gauche de la souris a été pressé
  #PB_EventType_LeftButtonUp    : Le bouton gauche de la souris a été relâché
  #PB_EventType_LeftClick       : Un clic avec le bouton gauche de la souris
  #PB_EventType_LeftDoubleClick : Un double-clic avec le bouton gauche de la souris
  #PB_EventType_RightButtonDown : Le bouton droit de la souris a été pressé
  #PB_EventType_RightButtonUp   : Le bouton droit de la souris a été relâché
  #PB_EventType_RightClick      : Un clic avec le bouton droit de la souris
  #PB_EventType_RightDoubleClick: Un double-clic avec le bouton droit de la souris
  #PB_EventType_MiddleButtonDown: Le bouton central de la souris a été pressé
  #PB_EventType_MiddleButtonUp  : Le bouton central de la souris a été relâché
  
  #PB_EventType_Focus           : Le gadget a obtenu le focus clavier
  #PB_EventType_LostFocus       : Le gadget a perdu le focus clavier
  #PB_EventType_KeyDown(*)      : Une touche clavier a été pressée 
  #PB_EventType_KeyUp(*)        : Une touche clavier a été relâchée 
  #PB_EventType_Input(*)        : Du texte a été entré dans le gadget 
Et maintenant le code documenté pas à pas.

Code : Tout sélectionner

EnableExplicit

Enumeration Window
  #mf
EndEnumeration

Enumeration Gadgets
  #mfImage  
EndEnumeration

Global image = CreateImage(#PB_Any, 200, 200) ;Création de l'image
Global x, y                                   ;Coordonnées x et y
Global event                                  ;Evenement

;Création d'une fenetre (utilise des énumérations c'est bien plus lisible que des numéros)
If OpenWindow(#mf, 0, 0, 200, 200, "Plot Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ;Container recevant l'image
  CanvasGadget(#mfImage, 0, 0, 200, 200)
  
  ;Affichage de l'image vierge créee précédement
  SetGadgetAttribute(#mfImage, #PB_Canvas_Image, ImageID(Image)) 
  
  ;Pour le fun, affichage d'un curseur personnalisé
  SetGadgetAttribute(#mfImage, #PB_Canvas_Cursor , #PB_Cursor_Cross) 
  
EndIf

Repeat
  Event = WaitWindowEvent()
  
  Select EventType()
    Case #PB_EventType_MouseMove ;Le curseur survole le canvas 
      
      ;Quel est la position du curseur
      x = GetGadgetAttribute(#mfImage, #PB_Canvas_MouseX)
      y = GetGadgetAttribute(#mfImage, #PB_Canvas_MouseY)
      
      ;SPH a dit : en deplacant la souris a la coordonnée x = 20,
      ;le Plot(x, y, RGB(m,m,m)) soit egale a Plot(x, y, RGB(20,20,20)).
      StartDrawing(ImageOutput(image))
      Plot(x, y, RGB(x, x, x))
      StopDrawing()
      
      ;Affichage de l'image
      SetGadgetAttribute(#mfImage, #PB_Canvas_Image, ImageID(Image)) 
      
  EndSelect
Until Event = #PB_Event_CloseWindow
A toi les joies du dessin sur un canvas.

Re: Le WindowsEvent

Publié : ven. 30/juin/2017 22:36
par SPH
Merci falsam.

Je ne sais pas ce qu'est un canvas mais je vais chercher. De plus, merci pour la liste du detail des evenements, ca va m'aider 8)