Problème dessin clic droit, à partir de CanvasGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
PCPixMusic
Messages : 106
Inscription : ven. 06/janv./2017 9:50

Problème dessin clic droit, à partir de CanvasGadget

Message par PCPixMusic »

Bonjour,

Afin d'avancer dans mon apprentissage de la souris en mode graphique. Je me suis amusé à modifier l'exemple de PureBasic, CanvasGadget.pb.

Seulement il n'y a plus que l'outil remplissage qui fonctionne avec les deux clics.

Seul l'outil brosse fonctionne partiellement seulement avec le clic gauche.
Cela fait deux jours que je cherche des réponses à ces questions sans succès.

Voici ma réécriture avec le code de base. Merci d'avance à toutes les personnes qui pourront m'aider.

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - CanvasGadget example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

; ================================================
;
;   PureBasic - Notysoft PurePaint v1.00 - 2017
;
;    (c) Notysoft Software
;
; ================================================

EnableExplicit

Enumeration
  #JPG_Couleurs_L
  #JPG_Couleurs_R
  
  #JPG_Contenu_L
  #JPG_Contenu_R
   
  #JPG_OuvrirSauver 
  
  #ID_Canvas  
  
  #ID_Couleur_L
  #ID_Couleur_R
  #ID_Brosse_L
  #ID_Brosse_R
  #ID_Ligne_L
  #ID_Ligne_R
  #ID_Boite_L
  #ID_Boite_R
  #ID_Cercle_L
  #ID_Cercle_R
  #ID_Remplir_L
  #ID_Remplir_R
  #ID_Effacer  
  #ID_Ouvrir  
  #ID_Saver  
  #ID_Aide  
  #ID_Test  
  #Fenetre_a_propos
  #TextAPropos1
  #TextAPropos2  
  #TextAPropos3
  #TextAPropos4  
  #TextAPropos5  
  
  #ID_bouton_a_propos  
  #ID_Close_Aide
  #Fenetre_PurePaint    
  
  #ID_Son_1
  #ID_Son_2
  #ID_Son_3
  #ID_Son_4
  #ID_Son_5
  #ID_Son_6
  #ID_Son_7
  #ID_Son_8
  #ID_Son_9
  #ID_Son_10
  #ID_Son_11
  #ID_Son_12
  #ID_Son_13
  #ID_Son_14
  #ID_Son_15
  #ID_Son_16
  #ID_Son_17
  #ID_Son_18
  #ID_Son_19
  #ID_Son_20
  
EndEnumeration

;-Declarations des Variables

Global Etat_Actuel_Color_L.i,Etat_Actuel_Color_R.i,Etat_Actuel_Mode_L.i,Etat_Actuel_Mode_R.i,StartX.i, StartY.i
Global X.i,Y.i,Rx.i,Ry.i,Event.i,Type.i,EventGadget.i,Gadget.i
Global Fichier.s

;-Declarations de Prcocedure

Declare Dessin(x, y, EventType)
Declare Open_PurePaint()
Declare Open_A_Propos()
Declare Sauver()
Declare Ouvrir()
Declare Effacer()

;-Initialisations
UseJPEGImageDecoder()
UseJPEGImageEncoder()


Procedure Dessin(x, y, EventType)

  If StartDrawing(CanvasOutput(#ID_Canvas))
    
    Select Etat_Actuel_Mode_L
    
      Case #ID_Brosse_L
        If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
          Circle(x, y, 5, Etat_Actuel_Color_L)
        EndIf
        
      Case #ID_Ligne_L
      If EventType = #PB_EventType_LeftButtonDown
        DrawImage(ImageID(#JPG_Contenu_L),0, 0)
        LineXY(StartX, StartY, x, y, Etat_Actuel_Color_L)
      EndIf
      
    Case #ID_Boite_L
    If EventType = #PB_EventType_LeftButtonDown
        DrawImage(ImageID(#JPG_Contenu_L), 0, 0)
        Box(StartX, StartY, x-StartX, y-StartY, Etat_Actuel_Color_L)
    EndIf
      
      
   Case #ID_Cercle_L
       If EventType = #PB_EventType_LeftButtonDown
        DrawImage(ImageID(#JPG_Contenu_L), 0, 0)
        
        If x > StartX
          rx = x - StartX
        Else
          rx = StartX - x
        EndIf
        
        If y > StartY
          ry = y - StartY
        Else
          ry = StartY - y
        EndIf
        
        If GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
          ry = rx
        EndIf
        
        Ellipse(StartX, StartY, rx, ry, Etat_Actuel_Color_L)
      EndIf      
           
      Case #ID_Remplir_L
        If EventType = #PB_EventType_LeftButtonDown
          FillArea(x, y, -1,Etat_Actuel_Color_L)
        EndIf
    EndSelect    
          
      ;================================================================    
    Select Etat_Actuel_Mode_R
        
      Case #ID_Brosse_R
        If EventType = #PB_EventType_RightButtonDown Or EventType = #PB_EventType_MouseMove
          Circle(x, y, 5, Etat_Actuel_Color_R)
        EndIf       

      
      Case #ID_Ligne_R
      If EventType = #PB_EventType_RightButtonDown
        DrawImage(ImageID(#JPG_Contenu_R), 0, 0)
        LineXY(StartX, StartY, x, y, Etat_Actuel_Color_R)
      EndIf
      
      
    Case #ID_Boite_R
    If EventType = #PB_EventType_RightButtonDown
        DrawImage(ImageID(#JPG_Contenu_R), 0, 0)
        Box(StartX, StartY, x-StartX, y-StartY, Etat_Actuel_Color_R)
    EndIf          
        
    Case #ID_Cercle_R
       If EventType = #PB_EventType_RightButtonDown
        DrawImage(ImageID(#JPG_Contenu_R), 0, 0)
        
        If x > StartX
          rx = x - StartX
        Else
          rx = StartX - x
        EndIf
        
        If y > StartY
          ry = y - StartY
        Else
          ry = StartY - y
        EndIf
        
        If GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
          ry = rx
        EndIf
        
        Ellipse(StartX, StartY, rx, ry, Etat_Actuel_Color_R)
      EndIf

      Case #ID_Remplir_R
        If EventType = #PB_EventType_RightButtonDown
          FillArea(x, y, -1,Etat_Actuel_Color_R)
        EndIf
  
    EndSelect
    
    StopDrawing()
  EndIf

EndProcedure

Procedure Open_PurePaint()
Etat_Actuel_Color_L = $000000
Etat_Actuel_Mode_L = #ID_Brosse_L

Etat_Actuel_Color_R = $000000
Etat_Actuel_Mode_R = #ID_Brosse_R

CreateImage(#JPG_Couleurs_L, 75, 75, 24)
CreateImage(#JPG_Couleurs_R, 75, 75, 24)

CreateImage(#JPG_Contenu_L, 830, 630, 24)
CreateImage(#JPG_Contenu_R, 830, 630, 24)

If OpenWindow(#Fenetre_PurePaint, 0, 0, 1000, 650, "Notysoft PurePaint v1.00 - 2017", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowColor(#Fenetre_PurePaint, RGB(150,150,150))
  
  CanvasGadget(#ID_Canvas, 160, 10, 830, 630, #PB_Canvas_ClipMouse)   
    
  ButtonImageGadget(#ID_Couleur_L, 10, 10, 70, 70, ImageID(#JPG_Couleurs_L))
  ButtonImageGadget(#ID_Couleur_R, 80, 10, 70, 70, ImageID(#JPG_Couleurs_R))
  
  ButtonGadget(#ID_Brosse_L, 10, 110,  70, 25, "Brosse  G",#PB_Button_Toggle)
  ButtonGadget(#ID_Ligne_L,  10, 140, 70, 25, "Ligne   G",#PB_Button_Toggle)
  ButtonGadget(#ID_Boite_L,  10, 170, 70, 25, "Boîte   G",#PB_Button_Toggle)
  ButtonGadget(#ID_Cercle_L, 10, 200, 70, 25, "Cercle  G",#PB_Button_Toggle)
  ButtonGadget(#ID_Remplir_L,10, 230, 70, 25, "Remplir G",#PB_Button_Toggle)
  
  ButtonGadget(#ID_Brosse_R, 80, 110,  70, 25, "Brosse  D",#PB_Button_Toggle)
  ButtonGadget(#ID_Ligne_R,  80, 140, 70, 25, "Ligne   D",#PB_Button_Toggle)
  ButtonGadget(#ID_Boite_R,  80, 170, 70, 25, "Boîte   D",#PB_Button_Toggle)
  ButtonGadget(#ID_Cercle_R, 80, 200, 70, 25, "Cercle  D",#PB_Button_Toggle)
  ButtonGadget(#ID_Remplir_R,80, 230, 70, 25, "Remplir D",#PB_Button_Toggle)
  
  ButtonGadget(#ID_Ouvrir, 10, 335, 70, 25, "Ouvrir")  
  ButtonGadget(#ID_Effacer,10, 365, 70, 25, "Effacer")  
  
  ButtonGadget(#ID_Saver,  80, 335, 70, 25, "Sauver")  
  ButtonGadget(#ID_Aide,   80, 365, 70, 25, "Aide")  
      
  SetGadgetState(#ID_Brosse_L, 1)
  SetGadgetState(#ID_Brosse_R, 1)
  
  SetGadgetAttribute(#ID_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
  
 EndIf
  
 EndProcedure
  
  Procedure Open_A_Propos()
  Protected iColor.I,iColorText.I  
  
  If OpenWindow(#Fenetre_a_propos,153,40,260,175, "Aide - A Propos", #PB_Window_TitleBar | #PB_Window_BorderLess,WindowID(#Fenetre_PurePaint))            
    SetWindowColor(#Fenetre_a_propos, RGB(150,150,150))
    
    ButtonGadget(#ID_Close_Aide,105,130,50,30, "Ok")  
    
    TextGadget(#TextAPropos1,0, 10, 259, 29,"Notysoft PurePaint v1.00 - 2017",#PB_Text_Center)    
    TextGadget(#TextAPropos2,0, 30, 259, 29,"Créer simplement des dessins",#PB_Text_Center)
    TextGadget(#TextAPropos3,0, 50, 259, 29,"Écrit par Frédéric CHERPE - 2016 - 2017",#PB_Text_Center)
    TextGadget(#TextAPropos4,0, 70, 259, 29,"À partir du fichier exemple CanvasGadget.pb",#PB_Text_Center)
    TextGadget(#TextAPropos5,0, 90, 259, 29,"En PureBasic de (c) Fantaisie Software ",#PB_Text_Center)
    
        
    For iColor = #TextAPropos1 To #TextAPropos5
      SetGadgetColor(iColor,#PB_Gadget_BackColor, RGB(150,150,150))        
      SetGadgetColor(iColor,#PB_Gadget_FrontColor,RGB(255,255,255))
    Next    
    
    ;If LoadSound(#ID_Son_1,"Sons\back.wav")      
    ;  PlaySound(#ID_Son_1)    
    ;EndIf   
             
      EndIf
    EndProcedure
    
; Initialisation
 
UseOGGSoundDecoder()  ; Utilisation des fichiers Ogg
UseFLACSoundDecoder() ; Utilisation des fichiers Flac
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()

If InitSound() = 0
  MessageRequester("Erreur", "carte son non détecté !",64)
  End
EndIf

Procedure Sauver()
          Fichier = SaveFileRequester("Sauver l'image...", Fichier, "JPEG Images|*.jpeg|Tous les fichiers|*.*", 0)
          If Fichier And (FileSize(Fichier) = -1 Or MessageRequester("Notysoft PurePaint v1.00 - 2017", "Écrire par dessus ce fichier ? " + Fichier, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
            If CreateImage(#JPG_OuvrirSauver, 830, 630, 24) And StartDrawing(ImageOutput(#JPG_OuvrirSauver))
              DrawImage(GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Image), 0, 0)
              StopDrawing()
              
              If SaveImage(#JPG_OuvrirSauver, Fichier, #PB_ImagePlugin_JPEG) = 0
                MessageRequester("Notysoft PurePaint v1.00 - 2017", "Impossible de sauvé l'image : " + Fichier)
              EndIf
              
              FreeImage(#JPG_OuvrirSauver)
            EndIf            
          EndIf
EndProcedure
        
Procedure Ouvrir()
          Fichier = OpenFileRequester("Ouvrir l'image...", "", "JPEG Images|*.jpeg|Tous les fichiers|*.*", 0)
          If Fichier
            If LoadImage(#JPG_OuvrirSauver, Fichier)
              If StartDrawing(CanvasOutput(#ID_Canvas))
                Box(0, 0, 830, 630, $FFFFFF)
                DrawImage(ImageID(#JPG_OuvrirSauver), 0, 0)
                StopDrawing()
              EndIf
              FreeImage(#JPG_OuvrirSauver)
            Else
              MessageRequester("Notysoft PurePaint v1.00 - 2017", "Impossible de lire l'image: " + Fichier)
            EndIf
          EndIf
EndProcedure 
        
Procedure Effacer()
      If StartDrawing(CanvasOutput(#ID_Canvas))
      Box(0, 0, 830, 630, $FFFFFF)
      StopDrawing()
      EndIf
EndProcedure        
    
    Open_PurePaint()

  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
    
      Select EventGadget()
      
        Case #ID_Canvas
          X = GetGadgetAttribute(#ID_Canvas, #PB_Canvas_MouseX)
          Y = GetGadgetAttribute(#ID_Canvas, #PB_Canvas_MouseY)
          Type = EventType()
        
          Select EventType()
          
            Case #PB_EventType_LeftButtonDown
              If StartDrawing(ImageOutput(#JPG_Contenu_L))
                DrawImage(GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Image), 0, 0)
                StopDrawing()
              EndIf
              
              StartX = X
              StartY = Y
              Dessin(X, Y, EventType())              
                     
            Case #PB_EventType_LeftButtonUp
              Dessin(X, Y, EventType())                        
            
            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
                Dessin(X, Y, EventType())            
              EndIf
                      
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          
          Case #PB_EventType_RightButtonDown
              If StartDrawing(ImageOutput(#JPG_Contenu_R))
                DrawImage(GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Image), 0, 0)
                StopDrawing()
              EndIf
              
              StartX = X
              StartY = Y
              Dessin(X, Y, EventType())              
                     
            Case #PB_EventType_RightButtonUp
              Dessin(X, Y, EventType())                        
            
            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_RightButton
                Dessin(X, Y, EventType())            
              EndIf
                      
          EndSelect
          
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        
       Case #ID_Couleur_L
          Etat_Actuel_Color_L = ColorRequester(Etat_Actuel_Color_L)
          If StartDrawing(ImageOutput(#JPG_Couleurs_L))
            Box(0, 0, 75, 75, Etat_Actuel_Color_L)
            StopDrawing()
            SetGadgetAttribute(#ID_Couleur_L,#PB_Button_Image, ImageID(#JPG_Couleurs_L))
          EndIf
          
        Case #ID_Couleur_R
          Etat_Actuel_Color_R = ColorRequester(Etat_Actuel_Color_R)
          If StartDrawing(ImageOutput(#JPG_Couleurs_R))
            Box(0, 0, 75, 75, Etat_Actuel_Color_R)
            StopDrawing()
            SetGadgetAttribute(#ID_Couleur_R,#PB_Button_Image, ImageID(#JPG_Couleurs_R))
          EndIf
          
          
        Case #ID_Brosse_L,#ID_Ligne_L,#ID_Boite_L,#ID_Cercle_L,#ID_Remplir_L
          EventGadget = EventGadget()
          For Gadget = #ID_Brosse_L To #ID_Remplir_L
            If Gadget = EventGadget
              SetGadgetState(Gadget, 1) 
            Else
              SetGadgetState(Gadget, 0)
            EndIf
          Next Gadget          
          Etat_Actuel_Mode_L = EventGadget   
          
          Case #ID_Brosse_R,#ID_Ligne_R,#ID_Boite_R,#ID_Cercle_R,#ID_Remplir_R
          EventGadget = EventGadget()
          For Gadget = #ID_Brosse_R To #ID_Remplir_R
            If Gadget = EventGadget
              SetGadgetState(Gadget, 1) 
            Else
              SetGadgetState(Gadget, 0)
            EndIf
          Next Gadget          
          Etat_Actuel_Mode_R = EventGadget 
          
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      
        Case #ID_Effacer
           Effacer()
      
        Case #ID_Ouvrir
         Ouvrir()          
        
        Case #ID_Saver
         Sauver()          
        
        Case #ID_Aide        
          Open_A_Propos() 
       
        Case #ID_Close_Aide          
          CloseWindow(#Fenetre_a_propos)
           
      EndSelect
    
    EndIf
    
  Until Event = #PB_Event_CloseWindow
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème dessin clic droit, à partir de CanvasGadget

Message par falsam »

Ton code est déconcertant.
- Ce qui compte c'est de savoir avec quelle couleur tu dessines je pense ? Clic gauche ou droit.
- La notion de brosse D, ligne D, etc ..... ne sert à rien.

- Le son il y a une raison ?

- Si tu définis une variable Type qui contient EventType() alors inutile de tester EventType par la suite.

Code : Tout sélectionner

Type = EventType()
        
        Select EventType()
- La lecture de ton code n'est pas évidente. Je jette un oeil quand même :wink:
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
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème dessin clic droit, à partir de CanvasGadget

Message par falsam »

Dans ta boucle événementielle tu testes deux fois #PB_EventType_MouseMove

Code : Tout sélectionner

          Case #PB_EventType_MouseMove
            If GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
              Dessin(X, Y, EventType())            
            EndIf
          Case #PB_EventType_MouseMove
            If GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_RightButton
              Dessin(X, Y, EventType())            
            EndIf
:arrow: Seul le premier sera intercepté. Ce qui implique que tu n'auras pas d'action pour le bouton droit.
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
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème dessin clic droit, à partir de CanvasGadget

Message par falsam »

Ptite correction de code

Code : Tout sélectionner

; ================================================
;
;   PureBasic - Notysoft PurePaint v1.00 - 2017
;
;    (c) Notysoft Software
;
; ================================================
EnableExplicit

Enumeration Window
  #Fenetre_PurePaint
  #Fenetre_a_propos
EndEnumeration

Enumeration Gadgets     
  #ID_Canvas  
  
  ;Selection couleur
  #ID_Couleur_L
  #ID_Couleur_R
  
  ;Outils
  #ID_Brosse 
  #ID_Ligne
  #ID_Boite
  #ID_Cercle
  #ID_Remplir
  
  #ID_Effacer  
  #ID_Ouvrir  
  #ID_Sauver  
  #ID_Aide  
  #ID_Test  
  
  ;A propos
  #TextAPropos1
  #TextAPropos2  
  #TextAPropos3
  #TextAPropos4  
  #TextAPropos5  
  
  #ID_bouton_a_propos  
  #ID_Close_Aide
EndEnumeration

Enumeration Images
  #JPG_Couleurs_L
  #JPG_Couleurs_R
  #JPG_OuvrirSauver 
EndEnumeration

;-Declarations des Variables
Global SaveImage

Global StartX.i, StartY.i, LastX.i, LastY.i

Global Etat_Actuel_Color_L.i, Etat_Actuel_Color_R.i
Global Etat_Actuel_Color.i, Etat_Actuel_Tool.i = #ID_Brosse

Global X.i, Y.i, Rx.i, Ry.i, Event.i, EventType.i, EventGadget.i, Gadget.i
Global Fichier.s 

;-Declarations de Prcocedure
Declare Open_PurePaint()
Declare Open_A_Propos()

Declare Dessin(x, y, EventType, Tool)
Declare Sauver()
Declare Ouvrir()
Declare Effacer()

;-Initialisations
UseJPEGImageDecoder()
UseJPEGImageEncoder()

UsePNGImageDecoder()
UsePNGImageEncoder()

Open_PurePaint()

Procedure Open_PurePaint()    
  CreateImage(#JPG_Couleurs_L, 75, 75, 24)
  CreateImage(#JPG_Couleurs_R, 75, 75, 24)
   
  If OpenWindow(#Fenetre_PurePaint, 0, 0, 1000, 650, "Notysoft PurePaint v1.00 - 2017", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    SetWindowColor(#Fenetre_PurePaint, RGB(150,150,150))
    
    CanvasGadget(#ID_Canvas, 160, 10, 830, 630)   
    
    ButtonImageGadget(#ID_Couleur_L, 10, 10, 70, 70, ImageID(#JPG_Couleurs_L))
    ButtonImageGadget(#ID_Couleur_R, 80, 10, 70, 70, ImageID(#JPG_Couleurs_R))
    
    ButtonGadget(#ID_Brosse, 10, 110,  70, 25, "Brosse",#PB_Button_Toggle)
    SetGadgetState(#ID_Brosse, 1)
    ButtonGadget(#ID_Ligne,  10, 140, 70, 25, "Ligne",#PB_Button_Toggle)
    ButtonGadget(#ID_Boite,  10, 170, 70, 25, "Boîte",#PB_Button_Toggle)
    ButtonGadget(#ID_Cercle, 10, 200, 70, 25, "Cercle",#PB_Button_Toggle)
    ButtonGadget(#ID_Remplir,10, 230, 70, 25, "Remplir",#PB_Button_Toggle)
        
    ButtonGadget(#ID_Ouvrir, 10, 335, 70, 25, "Ouvrir")  
    ButtonGadget(#ID_Effacer,10, 365, 70, 25, "Effacer")  
    
    ButtonGadget(#ID_Sauver,  80, 335, 70, 25, "Sauver")  
    ButtonGadget(#ID_Aide,   80, 365, 70, 25, "Aide")  
        
    SetGadgetAttribute(#ID_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
  EndIf
EndProcedure

Procedure Open_A_Propos()
  Protected Gadget, iColorText.I  
  
  If OpenWindow(#Fenetre_a_propos,153,40,260,175, "Aide - A Propos", #PB_Window_TitleBar | #PB_Window_BorderLess | #PB_Window_ScreenCentered, WindowID(#Fenetre_PurePaint))            
    SetWindowColor(#Fenetre_a_propos, RGB(150,150,150))
    
    ButtonGadget(#ID_Close_Aide,105,130,50,30, "Ok")  
    
    TextGadget(#TextAPropos1,0, 10, 259, 29,"Notysoft PurePaint v1.00 - 2017",#PB_Text_Center)    
    TextGadget(#TextAPropos2,0, 30, 259, 29,"Créer simplement des dessins",#PB_Text_Center)
    TextGadget(#TextAPropos3,0, 50, 259, 29,"Écrit par Frédéric CHERPE - 2016 - 2017",#PB_Text_Center)
    TextGadget(#TextAPropos4,0, 70, 259, 29,"À partir du fichier exemple CanvasGadget.pb",#PB_Text_Center)
    TextGadget(#TextAPropos5,0, 90, 259, 29,"En PureBasic de (c) Fantaisie Software ",#PB_Text_Center)
    
    For Gadget = #TextAPropos1 To #TextAPropos5
      SetGadgetColor(Gadget, #PB_Gadget_BackColor, RGB(150,150,150))        
      SetGadgetColor(Gadget, #PB_Gadget_FrontColor, RGB(255,255,255))
    Next       
  EndIf
EndProcedure

Procedure Dessin(x, y, EventType, Tool)
  
  ;Quel est la couleur à prendre en compte ?
  Select EventType
    Case #PB_EventType_LeftButtonDown
      Etat_Actuel_Color = Etat_Actuel_Color_L
      
    Case #PB_EventType_RightButtonDown
      Etat_Actuel_Color = Etat_Actuel_Color_R
      
    Case #PB_EventType_LeftButtonUp, #PB_EventType_RightButtonUp  
      
  EndSelect
  
  If StartDrawing(CanvasOutput(#ID_Canvas))
    Select Etat_Actuel_Tool
        
      Case #ID_Brosse
        Circle(x, y, 5, Etat_Actuel_Color)
        
      Case #ID_Ligne
        DrawImage(ImageID(SaveImage), 0, 0)
        LineXY(StartX, StartY, x, y, Etat_Actuel_Color)
        
      Case #ID_Boite
        DrawImage(ImageID(SaveImage), 0, 0)
        Box(StartX, StartY, x-StartX, y-StartY, Etat_Actuel_Color)
              
      Case #ID_Cercle  
        DrawImage(ImageID(SaveImage), 0, 0)
        If x > StartX
          rx = x - StartX
        Else
          rx = StartX - x
        EndIf
        
        If y > StartY
          ry = y - StartY
        Else
          ry = StartY - y
        EndIf
        
        If GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
          ry = rx
        EndIf
        Ellipse(StartX, StartY, rx, ry, Etat_Actuel_Color)
        
      Case #ID_Remplir
        FillArea(x, y, -1,Etat_Actuel_Color)
    EndSelect    
    
    StopDrawing()
  EndIf
  
EndProcedure

Procedure Sauver()
  Fichier = SaveFileRequester("Sauver l'image...", Fichier, "JPEG Images|*.jpeg|Tous les fichiers|*.*", 0)
  If Fichier And (FileSize(Fichier) = -1 Or MessageRequester("Notysoft PurePaint v1.00 - 2017", "Écrire par dessus ce fichier ? " + Fichier, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
    If CreateImage(#JPG_OuvrirSauver, 830, 630, 24) And StartDrawing(ImageOutput(#JPG_OuvrirSauver))
      DrawImage(GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Image), 0, 0)
      StopDrawing()
      
      If SaveImage(#JPG_OuvrirSauver, Fichier, #PB_ImagePlugin_JPEG) = 0
        MessageRequester("Notysoft PurePaint v1.00 - 2017", "Impossible de sauvé l'image : " + Fichier)
      EndIf
      
      FreeImage(#JPG_OuvrirSauver)
    EndIf            
  EndIf
EndProcedure

Procedure Ouvrir()
  Fichier = OpenFileRequester("Ouvrir l'image...", "", "JPEG Images|*.jpeg|Tous les fichiers|*.*", 0)
  If Fichier
    If LoadImage(#JPG_OuvrirSauver, Fichier)
      If StartDrawing(CanvasOutput(#ID_Canvas))
        Box(0, 0, 830, 630, $FFFFFF)
        DrawImage(ImageID(#JPG_OuvrirSauver), 0, 0)
        StopDrawing()
      EndIf
      FreeImage(#JPG_OuvrirSauver)
    Else
      MessageRequester("Notysoft PurePaint v1.00 - 2017", "Impossible de lire l'image: " + Fichier)
    EndIf
  EndIf
EndProcedure 

Procedure Effacer()
  If StartDrawing(CanvasOutput(#ID_Canvas))
    Box(0, 0, 830, 630, $FFFFFF)
    StopDrawing()
  EndIf
EndProcedure        

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      
      Select EventGadget
          
        Case #ID_Canvas
          X = GetGadgetAttribute(#ID_Canvas, #PB_Canvas_MouseX)
          Y = GetGadgetAttribute(#ID_Canvas, #PB_Canvas_MouseY)
          EventType = EventType()
          
          Select EventType
            Case #PB_EventType_LeftButtonDown, #PB_EventType_RightButtonDown     
              ;Sauvegarde du dessin qui sera utilisé pour la création des lignes, box et cercles.
              SaveImage = CreateImage(-1, GadgetWidth(#ID_Canvas), GadgetHeight(#ID_Canvas), 24)
              StartDrawing(ImageOutput(SaveImage))
              DrawImage(GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Image), 0, 0)
              StopDrawing()
              
              StartX = X
              StartY = Y
              Dessin(X, Y, EventType, Etat_Actuel_Tool)              
              
            Case #PB_EventType_LeftButtonUp, #PB_EventType_RightButtonUp              
              Dessin(X, Y, EventType, Etat_Actuel_Tool)                        
              
            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton Or 
                 GetGadgetAttribute(#ID_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_RightButton
                Dessin(X, Y, EventType, Etat_Actuel_Tool)            
              EndIf
          EndSelect        
          
        Case #ID_Couleur_L ;Choix couleur associé au click gauche : Dessin de sa représentation couleur
          Etat_Actuel_Color_L = ColorRequester(Etat_Actuel_Color_L)
          If StartDrawing(ImageOutput(#JPG_Couleurs_L))
            Box(0, 0, 75, 75, Etat_Actuel_Color_L)
            StopDrawing()
            SetGadgetAttribute(#ID_Couleur_L,#PB_Button_Image, ImageID(#JPG_Couleurs_L))
          EndIf
          
        Case #ID_Couleur_R ;Choix couleur associé au click droit : Dessin de sa représentation couleur
          Etat_Actuel_Color_R = ColorRequester(Etat_Actuel_Color_R)
          If StartDrawing(ImageOutput(#JPG_Couleurs_R))
            Box(0, 0, 75, 75, Etat_Actuel_Color_R)
            StopDrawing()
            SetGadgetAttribute(#ID_Couleur_R,#PB_Button_Image, ImageID(#JPG_Couleurs_R))
          EndIf
          
        Case #ID_Brosse,#ID_Ligne, #ID_Boite, #ID_Cercle, #ID_Remplir
          ;Mémorisation de l'outil à utiliser
          Etat_Actuel_Tool = EventGadget
          
          ;Pour tous les gadgets désactivation de l'état enfoncé
          For Gadget = #ID_Brosse To #ID_Remplir
            SetGadgetState(Gadget, 0)
          Next
          
          ;Activation de l'état enfoncé pour l'outil sélectionné
          SetGadgetState(EventGadget, 1)
          
        Case #ID_Effacer
          Effacer()
          
        Case #ID_Ouvrir
          Ouvrir()          
          
        Case #ID_Sauver
          Sauver()          
          
        Case #ID_Aide        
          Open_A_Propos() 
          
        Case #ID_Close_Aide   
          CloseWindow(#Fenetre_a_propos)
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()         
        Case #Fenetre_PurePaint
          ;Faire le controle de sauvegarde
          End 
          
      EndSelect
  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%
PCPixMusic
Messages : 106
Inscription : ven. 06/janv./2017 9:50

Re: Problème dessin clic droit, à partir de CanvasGadget

Message par PCPixMusic »

Bonjour Falsam,

Merci encore pour tes explications claires. J

Je n'avais pas du tous pensé à EventType() et #PB_EventType_MouseMove en double. En effet, toujours faire au plus simple.
Tu as mis "Enumeration Gadgets" et "Enumeration Images". Tu peux mettre des constantes dans des variables ? Je ne comprends pas. ^^

Le son c'est parce que c'est plus sympa et que je trouve que la vie ne serait pas possible pour moi sans un peu de musique. :mrgreen:

C'est exactement ce que je voulais comme résultat. J'avais fait des outils par clics, car je n'arrivais pas a en faire un seul pour les deux clics. Je t'ajoute aux crédits du code. :mrgreen:

Merci encore pour toute ton aide et tes connaissances.
Répondre