Le WindowsEvent

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Le WindowsEvent

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Le WindowsEvent

Message 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 ;)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Le WindowsEvent

Message par SPH »

Merci 8O

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Le WindowsEvent

Message 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:
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Le WindowsEvent

Message 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...
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Le WindowsEvent

Message par JohnJohnsonSHERMAN »

[12:45 - 30/06/17] flemme.exe a déclaré illégal le conseil de l'utilisateur Zorro

:mrgreen:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Le WindowsEvent

Message 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:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Le WindowsEvent

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Le WindowsEvent

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre