Event clavier

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Event clavier

Message par blendman »

salut

J'ai testé les nouveaux eventtype() lié au canvasgadget, mais si je mets setactivegadget(#canvas), je perds le focus sur d'autres gadgets (des checkbox de mon interface par exemple) ou alors, ça ne marche tout simplement pas.

Du coup, je dois passer par :

Code : Tout sélectionner

   Case #WM_KEYDOWN
     If EventwParam() = #VK_CONTROL
       pipette= 1
     EndIf
     
   Case #WM_KEYUP
     If EventwParam() = #VK_CONTROL
       pipette= 0
     EndIf
Mais niveau compatibilité linux/mac c'est pas top...

savez-vous comment on peut récupérer les events key up et down sans faire un setactivegadget() sur le canvas ?
Ou bien l'équivalent pour mac et linux du code au dessus ?

En gros, le code est celui posté sur mon sujet animatoon (enfin, avec quelques ajouts depuis).

Merci d'avance.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Event clavier

Message par falsam »

Bonjour Blendman.
Je te propose une solution qui j’espère répondra à ta demande.
Utilise la touche L et Ctrl+P pour tester ce code.

Code : Tout sélectionner

Enumeration
  #Window
  #Kbd_Ligne   ;L
  #Kbd_Pipette ;Control+P
EndEnumeration

;Ouverture d'une fenetre
OpenWindow(#Window, 0, 0, 500, 400, "Test touche", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

;Assignation d'une touche ou d'une combinaison de touche à cette fenetre
AddKeyboardShortcut(#Window, #PB_Shortcut_Control|#PB_Shortcut_P, #Kbd_Pipette)
AddKeyboardShortcut(#Window, #PB_Shortcut_L, #Kbd_Ligne)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Menu
      Select EventMenu()
        Case #Kbd_Pipette
          Debug "Outil Pipette"
          
        Case #Kbd_Ligne
          Debug "Outil Ligne"
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      End
      
  EndSelect
  
ForEver
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%
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Re: Event clavier

Message par jbernard13 »

falsam , j'ai testé ton code , il marche pas sous japbe , mais quand je lance avec l'editeur de purebasic là il marche .
Jbernard13
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Event clavier

Message par falsam »

jbernard13 a écrit :falsam , j'ai testé ton code , il marche pas sous japbe , mais quand je lance avec l'editeur de purebasic là il marche .
Le code ne fonctionne qu'avec la version 4.60 de PB. Peut être que le compilateur 4.60 n'était pas activé dans japbe.
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
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Event clavier

Message par blendman »

coucou Falsam.

Merci pour ton exemple. Je connaissais les shortcut (je les utlise dans mon logiciel animatoon).

En fait, ce que je cherche c'est l'équivalent de :

Code : Tout sélectionner

 keyboardPushed() ou #WM_KEYDOWN
keyboardRelease() ou #WM_KEYUP
mais sans le screen d'activé (ça bug avec les palettes graphiques hélas)

Les shortcut vérifient uniquement si la touche est pressée, pas si elle est ensuite relâchée (#WM_KEYUP) ;).
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Event clavier

Message par falsam »

Je continue mes tests sur le canvasgadget (PB 4.60) et dans cet exemple je teste différents évènements sur et en dehors du canvas. Je ne sais pas si le code est académique, mais il permet de tester les evemenents KeyDown et KeyUp dans un contexte cross-plateform. J'en ai profité pour ajouter d'autres tests sur le canvas.

Code : Tout sélectionner

Enumeration
  #Mainform
  #Grid
  #CheckBox
  #Combo
  #Image
EndEnumeration

OpenWindow(#Mainform, 0, 0, 500, 400, "test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CanvasGadget(#Grid, 0, 0, 350, 400, #PB_Canvas_Keyboard)
SetActiveGadget(#Grid)

CheckBoxGadget(#CheckBox, 380, 20, 80, 20, "test")

ComboBoxGadget(#Combo, 380, 45, 80, 20)
AddGadgetItem(#Combo, -1, "Test")

ImageGadget(#Image, 380, 75, 80, 80, ImageID(CreateImage(#PB_Any,  80, 80)))

Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_Menu
      Select EventMenu()            
      EndSelect
       
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Grid
          Select EventType()            
              
            Case #PB_EventType_LeftButtonDown
              Debug "Left Button Down"
  
            Case #PB_EventType_LeftButtonUp
              Debug "Left Button Up"
                                
            Case #PB_EventType_RightButtonDown
              Debug "Right Button Down"
                
            Case #PB_EventType_RightButtonUp
              Debug "Right Button Up"
                                
            Case #PB_EventType_MouseMove
              Debug "Mouse Move"
              
            Case #PB_EventType_KeyDown
              Debug "Key Down"             
              
            Case #PB_EventType_KeyUp
              Debug "Key Up - "+ Str(GetGadgetAttribute(#Grid,#PB_Canvas_Key ))     
              
            Case #PB_EventType_MouseWheel 
              WheelStep=GetGadgetAttribute(#Grid, #PB_Canvas_WheelDelta)
              ResizeGadget(#Grid, #PB_Ignore, #PB_Ignore, GadgetWidth(#Grid)+WheelStep, GadgetHeight(#Grid)+WheelStep)
              
          EndSelect ;End EventType 
          
        Case #CheckBox
          Debug "Checkbox"
          SetActiveGadget(#Grid)
                    
        Case #Combo
          Debug "Combo"
          SetActiveGadget(#Grid)
          
        Case#Image
          Debug "Image"
          SetActiveGadget(#Grid)
            
        Default
          SetActiveGadget(#Grid)
          
      EndSelect
      
            
    Case #PB_Event_CloseWindow
      End   
        
  EndSelect

ForEver
Apres avoir cliquer sur l'image (toute noire) et sur le gadget Checkbox, tu peux tester le Keydown\Up sans pour cela replacer le curseur de la souris sur le canvas.

PS : Je remercie d'avance ceux qui testeront ce code dans un environnement Linux/Mac.
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%
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Re: Event clavier

Message par Good07 »

Bonjour Faisam,

Bon, j'ai testé sur IMac :
Mac Osx 10.6.8
PureBasic 4.60 B3

Cela semble fonctionner.

Sans rien faire si je passe sur le canvasgadget, j'ai mousemove qui s'inscrit dans la fenêtre débug.

Lorsque je clique sur le petit carré noir, j'ai image qui s'inscrit dans la fenêtre Débug, en cliquant sur test j'ai combo dans la fenêtre debug et enfin j'ai checkbox si je valide la case à cocher.

En cliquant sur test dans le combobox j'ai un rectangle blanc qui apparaît sur la gauche et qui donne je suppose la surface du canvasgadget.

Par contre si je clique dans cette surface j'ai bien :
Left button down
Left button up
Right button down
Right button up

Si je sors de la surface du canvas je n'ai plus de retour sur l'action des boutons de la souris, mais j'ai bien le retour de keyDown et KeyUp en permanence indépendamment de la position de la souris.
Donc, si j'ai bien tous compris sous Mac le fonctionnement semble normal.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Event clavier

Message par falsam »

Good07 a écrit : IMac - Mac Osx 10.6.8
PureBasic 4.60 B3

Donc, si j'ai bien tous compris sous Mac le fonctionnement semble normal.
Ouiiiii et c'est génial. Merci.
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
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Event clavier

Message par blendman »

j'ai modifié un peu ton exemple, mais lorsque je clic et bouge la souris, ça ne dessine pas sur l'image, pourquoi ,

Code : Tout sélectionner

Enumeration
  #Mainform
  #Grid
  #CheckBox
  #Combo
  #Image
  #IG_finale
  #IG_canvas
  #scroll
EndEnumeration

Enumeration
  #img_canvas
  #layer1
  #layer2
  #img_final
EndEnumeration



Procedure paint()  
  StartDrawing(ImageOutput(#img_final))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  Circle(xx,yy,10,RGBA(125,125,125,255))
  StopDrawing()
  SetGadgetState(#IG_finale,ImageID(#img_final)) 
EndProcedure

CreateImage(#img_canvas,700,700,32)
CreateImage(#img_final,700,700,32)

StartDrawing(ImageOutput(#img_final))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0,0,700,700,RGBA(0,0,0,0))
  StopDrawing()

Global xx, yy, paint.b

OpenWindow(#Mainform, 0, 0, 1024, 768, "test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ScrollAreaGadget(#scroll,0,0,600,600,800,800,30)
CanvasGadget(#Grid, 50, 50, 700, 700, #PB_Canvas_Keyboard|#PB_Canvas_ClipMouse)
ImageGadget(#IG_finale,50,50,700,700,ImageID(#img_final))
CloseGadgetList()
SetActiveGadget(#Grid)



CheckBoxGadget(#CheckBox, 650, 20, 80, 20, "test")

ComboBoxGadget(#Combo, 650, 45, 80, 20)
AddGadgetItem(#Combo, -1, "Test")

ImageGadget(#Image, 650, 75, 80, 80, ImageID(CreateImage(#PB_Any,  80, 80)))

Repeat
  event = WaitWindowEvent()
  
 
  
  Select event 
    Case #PB_Event_Menu
      Select EventMenu()           
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget()          

        Case #Grid
          
          
          Select EventType()           
              
            Case #PB_EventType_LeftButtonDown
              Debug "Left Button Down"
              paint = 1
              
            Case #PB_EventType_LeftButtonUp
              Debug "Left Button Up"
              paint = 0
              
            Case #PB_EventType_RightButtonDown
              Debug "Right Button Down"
              
            Case #PB_EventType_RightButtonUp
              Debug "Right Button Up"
              
            Case #PB_EventType_MouseMove
              If paint = 1
              xx= GetGadgetAttribute(#Grid,#PB_Canvas_MouseX)     
              yy= GetGadgetAttribute(#Grid,#PB_Canvas_MouseY)
              paint()
              Debug Str(xx)+"/"+Str(yy)
            EndIf
            
    
              
            Case #PB_EventType_KeyDown
              Debug "Key Down"             
              
            Case #PB_EventType_KeyUp
              Debug "Key Up - "+ Str(GetGadgetAttribute(#Grid,#PB_Canvas_Key ))     
              
            Case #PB_EventType_MouseWheel
              WheelStep=GetGadgetAttribute(#Grid, #PB_Canvas_WheelDelta)
              ResizeGadget(#Grid, #PB_Ignore, #PB_Ignore, GadgetWidth(#Grid)+WheelStep, GadgetHeight(#Grid)+WheelStep)
              
          EndSelect ;End EventType
          
        Case #CheckBox
          Debug "Checkbox"
          SetActiveGadget(#Grid)
          
        Case #Combo
          Debug "Combo"
          SetActiveGadget(#Grid)
          
        Case#Image
          Debug "Image"
          SetActiveGadget(#Grid)
          
        Default
          SetActiveGadget(#Grid)
          
      EndSelect
      
      
    Case #PB_Event_CloseWindow
      End   
      
  EndSelect
  
ForEver
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Re: Event clavier

Message par Good07 »

Bonsoir blendman,

Je pense que c'est normal, il suffit de mettre:

Code : Tout sélectionner

Global xx, yy, paint.b
juste après Enumeration pour que xx,yy,paint.b soient pris en compte en global dans tous le programme. En le mettant après la procédure Paint(), xx et yy restent à zéro dans cette procédure. :D
Ou alors faire une procédure Paint(xx,yy) ce qui évite de mettre xx et yy en global.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Event clavier

Message par blendman »

Good07 a écrit :Ou alors faire une procédure Paint(xx,yy) ce qui évite de mettre xx et yy en global.
salut
Effectivement, c'est ce que j'ai fait finalement :).
Mais étant donné que les canvas ne sont pas transparent, et bien je ne peux pas m'en servir, et c'est bien dommage.

EDIT :
j'ai fait des essais avec les canvas et en fait, étant donné que l'on peut mettre des images dessus et que ces images, elles peuvent être transparentes, ça fonctionne :).

Donc c'est cool, car je peux utiliser les canvas et avoir tous les avantages que propose ce gadget (double buffer, event mouse et keyboard , multi OS, etc..) et avoir des calques transparents.

J'ai testé et ça marche nickel.

Maintenant, le plus compliqué reste de trouver un système de gomme qui fonctionne même avec les brush (pas uniquement avec les cercle, car ça fonctionne facilement).
Répondre