[Résolu] Obtenir un seul clic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Obtenir un seul clic

Message par Micoute »

Bonjour à tous,

voulant aider mon ami Shadow, j'ai voulu faire un éditeur de checkpoints, mais j'ai un problème quand je veux ajouter un élément dans la liste en cliquant sur le bouton gauche ou en en supprimant un en cliquant sur le bouton droit.

Ce que je souhaite : en cliquant sur le bouton gauche, ajouter un seul élément dans la liste, mais il me manque un filtre pour éviter d'en ajouter plusieurs non souhaités.
Le principe est le même avec le bouton droit, sauf qu'il supprime le dernier élément.

Je viens donc encore solliciter votre aide bienveillante et bien venue et je vous en remercie par anticapation.

Code : Tout sélectionner

; constantes, enumeration, variables, structures
Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Images
  #Melbourne
EndEnumeration

#LargeurEcr = 1920 ;On peut choisir la résolution qu'on veut
#HauteurEcr = 1080 

Structure Position
  X.i
  Y.i
EndStructure

Global FichierParDefaut$, Filtre$, Filtre, Fichier$, FichierImage, BtnGauche, BtnDroit, evenement, Mx, My, Quitter
Global.position NewList Checkpoint()


; Décodeurs, encodeurs
UsePNGImageDecoder()

; Initialisations
InitSprite() : InitKeyboard() : InitMouse()

Procedure Ouvrir_Fenetre_principale()
  OpenWindow(#Fenetre_principale, 0, 0, #LargeurEcr, #HauteurEcr, "Editeur de Check-Points", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
  OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, #LargeurEcr, #HauteurEcr)
  
  FichierParDefaut$ = ""
  Filtre$ = "Image PNG (*.png)|*.png"
  Filtre  = 0    ; utiliser  par défaut le premier des trois filtres possibles
  Fichier$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
  
  BtnGauche = 1
  BtnDroit = 2
  
  If Fichier$
    ; Charge une image
    FichierImage = LoadImage(#PB_Any, Fichier$)
  EndIf
  
  SetClassLongPtr_(ScreenID(), #GCL_HCURSOR, LoadCursor_(0, #IDC_ARROW))
  ShowCursor_(#True) ; montrer le curseur
EndProcedure

Procedure GestionSouris()
  If MouseButton(BtnGauche)
    AddElement(Checkpoint())
    Checkpoint()\X = Mx
    Checkpoint()\Y = My
  ElseIf MouseButton(BtnDroit)
    If ListSize(Checkpoint())
      LastElement(Checkpoint())
      DeleteElement(Checkpoint())
    EndIf
  EndIf
EndProcedure

Procedure Afficher()
  StartDrawing(ScreenOutput())
  If FichierImage
    DrawImage(ImageID(FichierImage), 0, 0, #LargeurEcr, #HauteurEcr)
    DrawText((#LargeurEcr-TextWidth(GetFilePart(Fichier$, #PB_FileSystem_NoExtension)))/2, 10, GetFilePart(Fichier$, #PB_FileSystem_NoExtension), 0, Point(0,0))
    DrawText(10,10, Str(mx) + "/" + Str(my), 0, Point(0,0))
    DrawText(10, #HauteurEcr - 20, "Appuyez sur Echap pour sortir", $FF, Point(0,0))
  EndIf
  StopDrawing()
EndProcedure

Procedure Quitter()
  If KeyboardPushed(#PB_Key_Escape)<>#Null
    Quitter = 1
  EndIf
EndProcedure

Ouvrir_Fenetre_principale()

Repeat
  evenement = WaitWindowEvent(1)
  ExamineKeyboard()
  ExamineMouse()
  Mx = MouseX()
  My = MouseY()
  
  Afficher()
  
  GestionSouris()
  
  Quitter()
  
  FlipBuffers()
Until Quitter = 1
End
Dernière modification par Micoute le dim. 03/janv./2016 8:46, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Obtenir un seul clic

Message par Ar-S »

Ton code va trés bien, il suffit de lui ajouter un sprite pour les checkpoint :

J'ai mis une double boucle repeat et le curseur DOT à la place de l'API

Code : Tout sélectionner



; Décodeurs, encodeurs
UsePNGImageDecoder()
; Initialisations
InitSprite() : InitKeyboard() : InitMouse()



; constantes, enumeration, variables, structures
Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Images
  #Melbourne
  #SPRITE_DOT  
EndEnumeration

#LargeurEcr = 1920 ;On peut choisir la résolution qu'on veut
#HauteurEcr = 1080

Structure Position
  X.i
  Y.i
EndStructure

Global FichierParDefaut$, Filtre$, Filtre, Fichier$, FichierImage, BtnGauche, BtnDroit, evenement, Mx, My, Quitter
Global.position NewList Checkpoint()





Procedure Ouvrir_Fenetre_principale()
  OpenWindow(#Fenetre_principale, 0, 0, #LargeurEcr, #HauteurEcr, "Editeur de Check-Points", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
  OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, #LargeurEcr, #HauteurEcr)
  
    ; CREATION DU SPRITE DES CHECKPOINTS //////////////////////
  CreateSprite(#SPRITE_DOT ,10,10)
  StartDrawing(SpriteOutput(#SPRITE_DOT))
  Circle(5,5,5,$FFFFFF)
  StopDrawing()
  ; //////////////////////////////////////////
  
  FichierParDefaut$ = ""
  Filtre$ = "Image PNG (*.png)|*.png"
  Filtre  = 0    ; utiliser  par défaut le premier des trois filtres possibles
  Fichier$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)
 
  BtnGauche = 1
  BtnDroit = 2
 
  If Fichier$
    ; Charge une image
    FichierImage = LoadImage(#PB_Any, Fichier$)
  EndIf
 
; Si on veut rester cross plateform pas besoin de ça
;   SetClassLongPtr_(ScreenID(), #GCL_HCURSOR, LoadCursor_(0, #IDC_ARROW))
;   ShowCursor_(#True) ; montrer le curseur
EndProcedure

Procedure GestionSouris()
  If MouseButton(BtnGauche)
    AddElement(Checkpoint())
    Checkpoint()\X = Mx
    Checkpoint()\Y = My
  ElseIf MouseButton(BtnDroit)
    If ListSize(Checkpoint())
      LastElement(Checkpoint())
      DeleteElement(Checkpoint())
    EndIf
  EndIf
EndProcedure

Procedure Afficher()
  
  If FichierImage
  StartDrawing(ScreenOutput())
  
    DrawImage(ImageID(FichierImage), 0, 0, #LargeurEcr, #HauteurEcr)
    DrawText((#LargeurEcr-TextWidth(GetFilePart(Fichier$, #PB_FileSystem_NoExtension)))/2, 10, GetFilePart(Fichier$, #PB_FileSystem_NoExtension), 0, Point(0,0))
    DrawText(10,10, Str(mx) + "/" + Str(my), 0, Point(0,0))
    DrawText(10, #HauteurEcr - 20, "Appuyez sur Echap pour sortir", $FF, Point(0,0))

    StopDrawing()
  EndIf
  
EndProcedure

Procedure Quitter()
  If KeyboardPushed(#PB_Key_Escape)<>#Null
    Quitter = 1
  EndIf
EndProcedure

Ouvrir_Fenetre_principale()

Repeat
  Repeat
    evenement = WaitWindowEvent(1)
  Until evenement = 0  
  
  ExamineKeyboard()
  ExamineMouse()
  Mx = MouseX()
  My = MouseY()
 
  Afficher()
 
  GestionSouris()
  
  ; AFFICHAGE DES CHECKPOINTS //////////////////////
  ForEach Checkpoint()
      DisplaySprite(#SPRITE_DOT, Checkpoint()\X, Checkpoint()\Y )
  Next
  ; ///////////////////////////////////////////
  
  ; AFFICHAGE DU CURSEUR / CHECKPOINT, ça evite l'API pour rester CROSSPLATEFORM
  ; Rien ne t'empeche de le remplacer par un sprite curseur dédié
  DisplaySprite(#SPRITE_DOT, Mx, My )
  
  Quitter()
 
  FlipBuffers()
Until Quitter = 1
End
~~~~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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Obtenir un seul clic

Message par Micoute »

Merci Ar-s, mais ça ajouter le même checkpoint de multiples fois, bien que j'adore le principe.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Obtenir un seul clic

Message par Ar-S »

je ne comprends pas ta demande.
un clic gauche = 1 element ds la liste = 1 point
un clic droit = suppression du dernier element de la liste et du dernier point
en cliquant sur le bouton gauche, ajouter un seul élément dans la liste, mais il me manque un filtre pour éviter d'en ajouter plusieurs non souhaités.
c'est pourtant bien ce qu'il se passe
~~~~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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Obtenir un seul clic

Message par Micoute »

En théorie, oui, mais si tu regardes de plus près, tu vois qu'il il y de multiples éléments qui ont les mêmes valeurs, ce qui ne compromet pas le fonctionnement du programme étant donné que je dimensionne le tableau en rapport avec la taille de la liste.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Obtenir un seul clic

Message par Ar-S »

désolé mais je ne pige vraiment pas ce que tu essayes de me dire, c'est peut être du à ma crève..
~~~~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
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Obtenir un seul clic

Message par case »

Code : Tout sélectionner

; Décodeurs, encodeurs
UsePNGImageDecoder()
; Initialisations
InitSprite() : InitKeyboard() : InitMouse()



; constantes, enumeration, variables, structures
Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Images
  #Melbourne
  #SPRITE_DOT 
EndEnumeration

#LargeurEcr = 1920 ;On peut choisir la résolution qu'on veut
#HauteurEcr = 1080

Structure Position
  X.i
  Y.i
EndStructure

Global FichierParDefaut$, Filtre$, Filtre, Fichier$, FichierImage, BtnGauche, BtnDroit, evenement, Mx, My, Quitter
Global.position NewList Checkpoint()





Procedure Ouvrir_Fenetre_principale()
  OpenWindow(#Fenetre_principale, 0, 0, #LargeurEcr, #HauteurEcr, "Editeur de Check-Points", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
  OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, #LargeurEcr, #HauteurEcr)
 
    ; CREATION DU SPRITE DES CHECKPOINTS //////////////////////
  CreateSprite(#SPRITE_DOT ,10,10)
  StartDrawing(SpriteOutput(#SPRITE_DOT))
  Circle(5,5,5,$FFFFFF)
  StopDrawing()
  ; //////////////////////////////////////////
 
  FichierParDefaut$ = ""
  Filtre$ = "Image PNG (*.png)|*.png"
  Filtre  = 0    ; utiliser  par défaut le premier des trois filtres possibles
  Fichier$ = OpenFileRequester("Choisissez un fichier à charger", FichierParDefaut$, Filtre$, Filtre)

  BtnGauche = 1
  BtnDroit = 2

  If Fichier$
    ; Charge une image
    FichierImage = LoadImage(#PB_Any, Fichier$)
  EndIf

; Si on veut rester cross plateform pas besoin de ça
;   SetClassLongPtr_(ScreenID(), #GCL_HCURSOR, LoadCursor_(0, #IDC_ARROW))
;   ShowCursor_(#True) ; montrer le curseur
EndProcedure

Procedure GestionSouris()
  If MouseButton(BtnGauche)
    AddElement(Checkpoint())
    Checkpoint()\X = Mx
    Checkpoint()\Y = My
    While MouseButton(BtnGauche) ; ###################################################
      WaitWindowEvent()                ; # pour ne pas avoir plusieur checkpoints ayant la meme valeur  si on clic trop #
     ExamineMouse()                      ; # longtemps on attend que le bouton de la souris soit relache                       #
    Wend                                      ; ###################################################
    
    
  ElseIf MouseButton(BtnDroit)
    If ListSize(Checkpoint())
      LastElement(Checkpoint())
      DeleteElement(Checkpoint())
    EndIf
    While MouseButton(BtnDroit) ; ###################################################
        WaitWindowEvent()           ; # pour ne pas avoir plusieur checkpoints ayant la meme valeur  si on clic trop #
        ExamineMouse()                ; # longtemps on attend que le bouton de la souris soit relache                       #
    Wend                                   ; ###################################################
  EndIf
EndProcedure

Procedure Afficher()
 
  If FichierImage
  StartDrawing(ScreenOutput())
 
    DrawImage(ImageID(FichierImage), 0, 0, #LargeurEcr, #HauteurEcr)
    DrawText((#LargeurEcr-TextWidth(GetFilePart(Fichier$, #PB_FileSystem_NoExtension)))/2, 10, GetFilePart(Fichier$, #PB_FileSystem_NoExtension), 0, Point(0,0))
    DrawText(10,10, Str(mx) + "/" + Str(my), 0, Point(0,0))
    DrawText(10, #HauteurEcr - 20, "Appuyez sur Echap pour sortir", $FF, Point(0,0))

    StopDrawing()
  EndIf
 
EndProcedure

Procedure Quitter()
  If KeyboardPushed(#PB_Key_Escape)<>#Null
    Quitter = 1
  EndIf
EndProcedure

Ouvrir_Fenetre_principale()

Repeat
  Repeat
    evenement = WaitWindowEvent(1)
  Until evenement = 0 
 
  ExamineKeyboard()
  ExamineMouse()
  Mx = MouseX()
  My = MouseY()

  Afficher()

  GestionSouris()
 
  ; AFFICHAGE DES CHECKPOINTS //////////////////////
  ForEach Checkpoint()
      DisplaySprite(#SPRITE_DOT, Checkpoint()\X, Checkpoint()\Y )
  Next
  ; ///////////////////////////////////////////
 
  ; AFFICHAGE DU CURSEUR / CHECKPOINT, ça evite l'API pour rester CROSSPLATEFORM
  ; Rien ne t'empeche de le remplacer par un sprite curseur dédié
  DisplaySprite(#SPRITE_DOT, Mx, My )
 
  Quitter()

  FlipBuffers()
Until Quitter = 1
End
ImageImage
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Obtenir un seul clic

Message par Micoute »

Immense merci à vous deux pour votre aide très précieuse pour moi, la bouche While/Wend est une riche trouvaille et fait parfaitement l'office de filtre que j'en attendais.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Résolu] Obtenir un seul clic

Message par Ar-S »

OK je viens de piger, lorsque je cliquais j'avais une incrémentation de 1, pas plus, un clic est un clic, la prochaine fois précise SI on laisse le clic gauche pressé on voit qu'il il y de multiples éléments qui ont les mêmes valeurs ! (d'ailleurs ça aussi c'est pas très juste)

Case à pigé et tant mieux pour toi mais la "justesse" des mots à son importance 8)
~~~~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
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Obtenir un seul clic

Message par case »

Ar-S a écrit :désolé mais je ne pige vraiment pas ce que tu essayes de me dire, c'est peut être du à ma crève..
:mrgreen:

ça a l'air d'aller mieux
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Résolu] Obtenir un seul clic

Message par Ar-S »

c'est parce que j'ai maté ton code :twisted:
Mais oui ça va un peu mieux :wink:
~~~~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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: [Résolu] Obtenir un seul clic

Message par Micoute »

Désolé de n'avoir pas été très clair dans l'explication des symptômes de mon problème, mais quand on se noie, on ne pense pas forcément à sortir la tête de l'eau pour voir qu'on est à seulement 1 centimètre du bord et qu'on panique pour rien !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Résolu] Obtenir un seul clic

Message par Ar-S »

Ouai mais si tu sorts pas au moins la main, les sauveteurs ils peuvent pas faire grand chose :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
Répondre