[R]Détecter le clic droit de la souris sur une étiquette

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
novembrezoulou
Niveau 4
Niveau 4
Messages : 53
Enregistré le : dim. 06 nov. 2011 14:06
Localisation : Joinville le pont
Status : Hors ligne

[R]Détecter le clic droit de la souris sur une étiquette

#1

Message par novembrezoulou »

Bonjour,
Développant un Sudoku, j'affiche les candidats (valeurs possibles pour une case) dans des étiquettes.
Un clic sur le candidat permet de le sélectionner.
Il arrive que, pour une case donnée, certains candidats puissent être éliminés même s'ils sont "possibles".
Je voudrais, en cliquant sur le bouton droit, effectuer une action différente de celle réalisée avec le bouton gauche, c'est à dire cacher le candidat.
Je ne pense pas qu'il soit nécessaire d'indiquer le code car mon seul problème est d'avoir une action différente en fonction du bouton (ceci étant, je peux le passer mais il est assez long... et sans doute mal ficelé pour les "pros").
Actuellement, je n'utilise pas la gestion des évènements... (pas assez pointu pour ça !)
J'ai vu que "mouseclick" génère un clic droit... mais ce que je veux, c'est l'inverse...
Merci de votre aide (ou du lien si le sujet a déjà été traité sur le forum, mais je n’ai pas trouvé, d'où ce post)...
Modifié en dernier par novembrezoulou le dim. 16 juil. 2017 23:54, modifié 2 fois.
L'aviation est un moyen de transport rapide pour gens pas pressés.
Plus on va moins vite, moins le temps est plus court...
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..]Détecter le clic droit de la souris

#2

Message par mikell »

Actuellement, je n'utilise pas la gestion des évènements...
Dommage parce que la réponse c'est GUICtrlSetOnEvent()
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
novembrezoulou
Niveau 4
Niveau 4
Messages : 53
Enregistré le : dim. 06 nov. 2011 14:06
Localisation : Joinville le pont
Status : Hors ligne

Re: [..]Détecter le clic droit de la souris

#3

Message par novembrezoulou »

Merci de cette réponse rapide...
En mettant l'option "GUIOnEventMode" à 1, afin d'utiliser la gestion des évènements, mes Switch basés sur "GUIGetMsg()" ne fonctionnent plus.
Je me replonge donc dans l'aide car je vais devoir modifier pas mal de choses !...
J'attends de réussir cette modification avant de clôturer ce post car, si je n'y arrive pas (mais je vais vraiment essayer !), je reviendrai vers ceux qui savent.
L'aviation est un moyen de transport rapide pour gens pas pressés.
Plus on va moins vite, moins le temps est plus court...
novembrezoulou
Niveau 4
Niveau 4
Messages : 53
Enregistré le : dim. 06 nov. 2011 14:06
Localisation : Joinville le pont
Status : Hors ligne

Re: [..]Détecter le clic droit de la souris

#4

Message par novembrezoulou »

Bon... J’essaie mais je n'y arrive guère. Pourtant, ce n'est pas faute d'avoir essayé
[code_au3]#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ColorConstants.au3>
Opt("MustDeclareVars", 1) ;0=no, 1=require pre-declaration
Opt("GUIOnEventMode", 1) ; Activation du mode événementiel

#Region Constantes
Const $LargeurCaseNombre = 3 * 21 + 3 ; 65
Const $HauteurCaseNombre = 3 * 21 + 3
Const $LargeurEspacementCasesNombre = 5 + $LargeurCaseNombre ; 70
Const $HauteurEspacementCasesNombre = 5 + $HauteurCaseNombre
Const $LargeurRegion = 3 * $LargeurCaseNombre + 15 ; 210
Const $HauteurRegion = 3 * $HauteurCaseNombre + 15
Const $LargeurEspacementRegion = 8 + $LargeurRegion ; 218
Const $HauteurEspacementRegion = 8 + $HauteurRegion
Const $LargeurMatrice = 3 * $LargeurRegion + 25 ; 669
Const $HauteurMatrice = 3 * $HauteurRegion + 63 ; 699
Const $NombreDeBoutons = 5
#EndRegion Constantes
#Region Déclarations
Global $VerticalCase, $HorizontalCase, $i, $j, $k; pointeurs de boucles
Global $FenetresRegion[9]; permet de tracer les régions
Global $FenetresCase[81], $EtiquettesCase[81]; permet de tracer et d'afficher le contenu des cases
Global $TableauDesValeursCases[81]; stocke la valeur des cases considérées comme bonnes et saisies par le joueur
For $i = 0 To 80
   $TableauDesValeursCases[$i] = 0; initialise le tableau ci-dessus
Next
#EndRegion Déclarations
#Region dessin de la matrice
; trace la matrice principale
Global $FenetreMatrice = GUICreate("Bloc note d'aide à la résolution de grilles Sudoku", $LargeurMatrice, $HauteurMatrice, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Terminer")
Global $BQuitter = GUICtrlCreateButton("Quitter", Int($LargeurMatrice / $NombreDeBoutons) * 4 + 1, $HauteurMatrice - 39, Int($LargeurMatrice / $NombreDeBoutons), 38)
GUICtrlSetOnEvent($BQuitter, "Terminer")
GUISetState(@SW_SHOW, $FenetreMatrice)

; trace les fenêtres des régions
For $VerticalRegion = 0 To 2 ; trace les trois lignes
   For $HorizontalRegion = 0 To 2 ; trace les régions d'une même ligne
      ; définit les fenêtres des régions
      $FenetresRegion[$HorizontalRegion + 3 * $VerticalRegion] = GUICreate("", $LargeurRegion, $HauteurRegion, 2 + $LargeurEspacementRegion * $HorizontalRegion, $HauteurEspacementRegion * $VerticalRegion + 2, $WS_CHILD, $WS_EX_OVERLAPPEDWINDOW, $FenetreMatrice);whlt
      ; affiche les fenêtres des régions
      GUISetState(@SW_SHOW, $FenetresRegion[$HorizontalRegion + 3 * $VerticalRegion])
   Next
Next

; trace les cases
For $Regions = 0 To 8
   For $VerticalCase = 0 To 2
      For $HorizontalCase = 0 To 2
         ; définit les fenêtres des cases
         $FenetresCase[9 * $Regions + $HorizontalCase + 3 * $VerticalCase] = GUICreate("", $LargeurCaseNombre, $HauteurCaseNombre, 2 + $LargeurEspacementCasesNombre * $HorizontalCase, 2 + $HauteurEspacementCasesNombre * $VerticalCase, $WS_CHILD, $WS_EX_OVERLAPPEDWINDOW, $FenetresRegion[$Regions]);whlt
         ; définit les étiquettes des cases et les crée avec un contenu vide
         $EtiquettesCase[9 * $Regions + $HorizontalCase + 3 * $VerticalCase] = GUICtrlCreateLabel("", 0, $HauteurCaseNombre / 5, $LargeurCaseNombre, $HauteurCaseNombre, $SS_CENTER) ; ltwh
         GUICtrlSetFont(-1, 24, 40, 0, "Arial")
         ; cache l'affichage de l'étiquette d'une case afin de permettre celui des candidats de cette case
         GUICtrlSetState(-1, $GUI_SHOW)
         GUICtrlSetOnEvent($EtiquettesCase[9 * $Regions + $HorizontalCase + 3 * $VerticalCase], "TerminerEtiquettes")
         ; affiche la fenêtre de la case
         GUISetState(@SW_SHOW, $FenetresCase[9 * $Regions + $HorizontalCase + 3 * $VerticalCase])
      Next
   Next
Next
#EndRegion
While 1

WEnd

#region fonctions
Func TerminerEtiquettes()
   Select
      Case $GUI_EVENT_PRIMARYDOWN
         MsgBox('', "clic_gauche", "clic_gauche_dans " & @GUI_CtrlId)
      Case $GUI_EVENT_SECONDARYDOWN
         MsgBox('', "clic_droit", "Clic_droit_dans  " & @GUI_CtrlId)
   EndSelect
EndFunc   ;==>TerminerEtiquettes

Func Terminer()
   If @GUI_WinHandle = $FenetreMatrice Then Exit

EndFunc   ;==>Terminer
#EndRegion[/code_au3]
Dans "TerminerEtiquettes" (région "fonctions" en fin de script), j'affiche bien le clic gauche, mais pas le droit.
Je viens de regarder toutes les fonctions dans la liste d'aide. Aucune ne semble renvoyer le type d'évènement... Il semble que l'on ne puisse interagir que si on indique un évènement alors que, précisément, je souhaiterais l'identifier dans le traitement.
Je précise que j'ai retiré une grosse partie de la GUI (candidats et boutons) et que je n'affiche que les cases pour gagner de la place. La procédure devrait être la même ensuite avec les 729 candidats possibles...
Encore merci de m'éclairer

Ajout : j'ai trouvé ça sur le forum anglophone
https://www.autoitscript.com/forum/topi ... ntry502117
mais quand je le lance pour voir ce qu'il fait, ça plante...
L'aviation est un moyen de transport rapide pour gens pas pressés.
Plus on va moins vite, moins le temps est plus court...
novembrezoulou
Niveau 4
Niveau 4
Messages : 53
Enregistré le : dim. 06 nov. 2011 14:06
Localisation : Joinville le pont
Status : Hors ligne

Re: [..]Détecter le clic droit de la souris

#5

Message par novembrezoulou »

Bonjour,
Je reprend ce projet, un peu mis en attente durant ces derniers mois.
Mon souci est de détecter le clic droit sur une étiquette. Si je le fais aisément dans une fenêtre en utilisant "GUISetOnEvent", GUICtrlSetOnEvent ne semble pas réagir à l'identique sur ce point. Est-il possible de récupérer le retour du clic souris afin de le traiter différemment selon qu'il s'agit d'un gauche ou d'un droit ?

Voici mon script initial. J'y ai occulté les "GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroitE1")" car, logiquement, ils interagissent avec la fenêtre et appellent leur fonction même en dehors d'un clic sur l'étiquette...

Un grand merci...

Code : Tout sélectionner

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
Global $Gui_1 = GUICreate("Fenetre 1", 615, 437, 200, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Gui_1Close")
Global $BQuitter1 = GUICtrlCreateButton("Quitter", 296, 312, 177, 49)
GUICtrlSetOnEvent(-1, "BQuitter1Click")
Global $Etiquette1 = GUICtrlCreateLabel("Etiquette 1", 72, 32, 252, 68)
GUICtrlSetFont(-1, 40, 400, 0, "MS Sans Serif")
GUICtrlSetOnEvent(-1, "Etiquette1Click")
GUISetState(@SW_SHOW)
;~ GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroitE1")

Global $Gui_2 = GUICreate("Fenetre 2", 615, 437, 1000, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Gui_1Close")
Global $BQuitter2 = GUICtrlCreateButton("Quitter", 296, 312, 177, 49)
GUICtrlSetOnEvent(-1, "BQuitter1Click")
Global $Etiquette2 = GUICtrlCreateLabel("Etiquette 2", 72, 32, 252, 68)
GUICtrlSetFont(-1, 40, 400, 0, "MS Sans Serif")
GUICtrlSetOnEvent(-1, "Etiquette2Click")
GUISetState(@SW_SHOW)
;~ GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroitE2")
#EndRegion ### END Koda GUI section ###
;~ _MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_MousePrimaryDown_Event")

While 1
  Sleep(100)
WEnd

Func ClickDroitE2()
		MsgBox('','',"clic droit sur étiquette 2")
EndFunc

Func ClickDroitE1()
		MsgBox('','',"clic droit sur étiquette 1")
EndFunc

Func BQuitter1Click()
	Exit
EndFunc

Func Etiquette1Click()
	MsgBox('','',"clic gauche sur étiquette 1 - ctrlId = " & @GUI_CtrlId)
EndFunc

Func Etiquette2Click()
	MsgBox('','',"clic gauche sur étiquette 2 - ctrlId = " & @GUI_CtrlId)
EndFunc
PS. Je n'ai toujours pas compris pourquoi l'UDF récupérée sur le forum anglophone (cf. dernier post) plante systématiquement AutoIt ?
L'aviation est un moyen de transport rapide pour gens pas pressés.
Plus on va moins vite, moins le temps est plus court...
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..]Détecter le clic droit de la souris

#6

Message par mikell »

novembrezoulou a écrit : ven. 14 juil. 2017 12:27J'y ai occulté les "GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroitE1")" car, logiquement, ils interagissent avec la fenêtre et appellent leur fonction même en dehors d'un clic sur l'étiquette
Il suffit donc de rendre ces clics sélectifs :wink:
Et tant qu'à faire, tout regrouper dans une seule fonction pour les 2 gui
GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroit")
;....
Func ClickDroit()
   $a = GUIGetCursorInfo(@GUI_WinHandle)
   Switch $a[4]
      Case $Etiquette1
         MsgBox('','',"clic droit sur étiquette 1")
      Case $Etiquette2
         MsgBox('','',"clic droit sur étiquette 2")
   EndSwitch
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
novembrezoulou
Niveau 4
Niveau 4
Messages : 53
Enregistré le : dim. 06 nov. 2011 14:06
Localisation : Joinville le pont
Status : Hors ligne

Re: [..]Détecter le clic droit de la souris sur une étiquette

#7

Message par novembrezoulou »

Merci de ta réponse.
Je n'avais pas pensé à "GUIGetCursorInfo"
Je vais appliquer cette solution (qui fonctionne parfaitement sur le petit script que j'ai fourni) sur une maquette de ma matrice SUDOKU et je reviendrai vers toi (et la communauté AutoIt) pour te donner le résultat de mon boulot.
Dans cette matrice (9 * 9), j'ai 729 étiquettes différentes ! (9 candidats par case). Je vais donc voir comment adapter ta solution.
L'aviation est un moyen de transport rapide pour gens pas pressés.
Plus on va moins vite, moins le temps est plus court...
novembrezoulou
Niveau 4
Niveau 4
Messages : 53
Enregistré le : dim. 06 nov. 2011 14:06
Localisation : Joinville le pont
Status : Hors ligne

Re: [..]Détecter le clic droit de la souris sur une étiquette

#8

Message par novembrezoulou »

En suivant ton conseil (et en galérant un peu mais c'est la règle du jeu...) je suis venu à bout de mon problème.
Je joins le code modifié pour n'afficher d’une seule région afin de ne pas alourdir le script.
Le clic droit (j'ai viré le code -qui fonctionne- traitant le clic gauche) modifie bien la couleur du candidat.
Je passe donc ce post en résolu.
Encore merci

Code : Tout sélectionner

Opt("MustDeclareVars", 1) ;0=no, 1=require pre-declaration
Opt("GUIOnEventMode", 1)

#Region Include
#include <ButtonConstants.au3>
#include <ColorConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIButton.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#EndRegion Include

#Region Déclarations
Global $VerticalCase, $HorizontalCase, $i, $j, $k, $VerticalCandidat, $HorizontalCandidat ; pointeurs de boucles
Global $FenetresRegion[9]; permet de tracer les régions
Global $FenetresCase[81], $EtiquettesCase[81]; permet de tracer et d'afficher le contenu des cases
Global $FenetresCandidat[729], $EtiquettesCandidat[729], $TableauDesValeursInitialesCandidats[729]; permet de tracer et d'afficher le contenu des candidats
Global $TableauDesValeursCourantesCandidats; stocke la valeur actualisée des candidats possibles
Global $TableauDesValeursCases[81]; stocke la valeur des cases considérées comme bonnes et saisies par le joueur
For $i = 0 To 80
	$TableauDesValeursCases[$i] = 0; initialise le tableau ci-dessus
Next
#EndRegion Déclarations

; Créer et tracer la matrice (Sudoku_Creation_Matrice)

; trace la matrice principale
Global $FenetreMatrice = GUICreate("Aide à la résolution de grilles Sudoku", 222, 260, -1, -1);-1111, 250);whlt
GUISetBkColor($COLOR_BLUE)
GUISetOnEvent($GUI_EVENT_CLOSE, "Terminer")
Global $BQuitter = GUICtrlCreateButton("Quitter", 1, 221, 220, 38);ltwh
GUICtrlSetOnEvent($BQuitter, "Terminer")
GUISetState(@SW_SHOW, $FenetreMatrice)
GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroitCandidat")
; 3= jaune très clair, 4= fuschia, 5= gris foncé, 6 = vert foncé, 7 vert clair, 8 rose foncé,  9 bleu foncé, 10 gris moyen, 11 vert très clair, 12 bleu très foncé, 13 caca d'oie,  15 rouge vif, 17 bleu ciel, 18 bleu-vert, 19 blanc, 20 jaune citron
; ------------------------------ MsgBox('','',"Hauteur : " & @DesktopHeight & "Largeur : " & @DesktopWidth)

; trace les fenêtres des régions
For $VerticalRegion = 0 To 0 ; trace les trois lignes
	For $HorizontalRegion = 0 To 0 ; trace les régions d'une même ligne
		; définit les fenêtres des régions
		$FenetresRegion[$HorizontalRegion + 3 * $VerticalRegion] = GUICreate("", 210, 210, 2 + 218 * $HorizontalRegion, 218 * $VerticalRegion + 2, $WS_CHILD, $WS_EX_OVERLAPPEDWINDOW, $FenetreMatrice);whlt
		; affiche les fenêtres des régions
		GUISetState(@SW_SHOW, $FenetresRegion[$HorizontalRegion + 3 * $VerticalRegion])
		GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroitCandidat")
	Next
Next

;~ ; trace les cases
For $VerticalCase = 0 To 2
	For $HorizontalCase = 0 To 2
		; définit les fenêtres des cases
		$FenetresCase[$HorizontalCase + 3 * $VerticalCase] = GUICreate("", 65, 65, 2 + 70 * $HorizontalCase, 2 + 70 * $VerticalCase, $WS_CHILD, $WS_EX_OVERLAPPEDWINDOW, $FenetresRegion[0]);whlt
		; définit les étiquettes des cases et les crée avec un contenu vide
		$EtiquettesCase[$HorizontalCase + 3 * $VerticalCase] = GUICtrlCreateLabel("", 0, 13, 65, 65, $SS_CENTER) ; ltwh
		GUICtrlSetFont(-1, 24, 40, 0, "Arial")
		GUICtrlSetColor(-1, $COLOR_MAROON)
		; cache l'affichage de l'étiquette d'une case afin de permettre celui des candidats de cette case
		GUICtrlSetState(-1, $GUI_HIDE)
		; affiche la fenêtre de la case
		GUISetState(@SW_SHOW, $FenetresCase[$HorizontalCase + 3 * $VerticalCase])
;~ 			GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroitCandidat")
	Next
Next


; trace les candidats
For $Cases = 0 To 8
	For $VerticalCandidat = 0 To 2
		For $HorizontalCandidat = 0 To 2
			; définit les fenêtres des candidats
			$FenetresCandidat[$HorizontalCandidat + 3 * $VerticalCandidat + 9 * $Cases] = GUICreate("", 21, 21, 21 * $HorizontalCandidat, 21 * $VerticalCandidat, $WS_CHILD, $WS_EX_OVERLAPPEDWINDOW, $FenetresCase[$Cases]);whlt
			; Appelle la prodécure de traitement du candidat
			GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "ClickDroitCandidat")
			; affiche les fenêtres des candidats
			GUISetState(@SW_SHOW, $FenetresCandidat[$HorizontalCandidat + 3 * $VerticalCandidat + 9 * $Cases])
			; définit les étiquettes des candidats
			$EtiquettesCandidat[$HorizontalCandidat + 3 * $VerticalCandidat + 9 * $Cases] = GUICtrlCreateLabel(1 + $HorizontalCandidat + 3 * $VerticalCandidat, 5, 5, -1, -1);, -1, -1) ltwh
			; initialise la valeur de départ des étiquettes candidats
			$TableauDesValeursInitialesCandidats[$HorizontalCandidat + 3 * $VerticalCandidat + 9 * $Cases] = 1 + $HorizontalCandidat + 3 * $VerticalCandidat
			GUICtrlSetFont(-1, 9, 900, 0, "Arial")
			GUICtrlSetColor(-1, $COLOR_BLACK);YELLOW)

		Next
	Next
Next

; initialise la valeur courante des étiquettes candidats (sera mise à jour au fur et à mesure du jeu
$TableauDesValeursCourantesCandidats = $TableauDesValeursInitialesCandidats

While 1

WEnd

Func ClickDroitCandidat()
	Local $a
	$a = GUIGetCursorInfo(@GUI_WinHandle)
	GUICtrlSetColor($EtiquettesCandidat[$a[4] - 13], $COLOR_RED)
EndFunc   ;==>ClickDroitCandidat


Func Terminer()
	Exit

EndFunc   ;==>Terminer
L'aviation est un moyen de transport rapide pour gens pas pressés.
Plus on va moins vite, moins le temps est plus court...
Répondre