Bonjour à tous.
Je cherche à mettre en place un composant de type bouton qui au survol exécute une fonction, et quand on appuye dessus (appui sans relache) effectue qqchose et quand on le relache effectue autre chose. Typiquement : Un bouton au bout d'un input de type password qui :
- quand on le hover : colorie l'input en rouge
- quand on le unhover : redonne la couleur de base à l'input (noir)
- quand on le pousse : affiche le texte en clair
- quand on le relache : cache le texte comme d'habitude (avec les points )
Je sais déjà le faire, mais à la manière crado, c'est à dire avec des boucles moches et du GUIGetCursorInfo. Je souhaiterais donc savoir si quelqu'un saurait comment faire cela proprement, c'est à dire avec un
GuiRegisterMsg ($WM_NOTIFY ou $WM_COMMAND ou autre, je ne maîtrise pas vraiment cet aspect :s).
Voici mon code de départ, merci d'avance pour votre aide !
► Afficher le texteCode avec boucles
Code : Tout sélectionner
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
; Variables
Global $dimension[2] = [200, 80]
; Composants graphiques
Global $GUI = GUICreate("Essai de champ password", $dimension[0], $dimension[1], Default, Default, 0x80800000) ; $WS_POPUP = 0x80000000 ; $WS_BORDER = 0x00800000
Global $title = GUICtrlCreateLabel("Password", 10, 10, $dimension[0]-55, 25, Default, 0x00100000) ; $GUI_WS_EX_PARENTDRAG = 0x00100000
Global $quit = GUICtrlCreateButton("X", $dimension[0]-35, 10, 25, 25)
Global $input = GUICtrlCreateInput("Passw0rd!", 10, 45, $dimension[0]-55, 25, 0x0020) ; $ES_PASSWORD = 0x0020
Global $input2 = GUICtrlCreateInput("Passw0rd!", 10, 45, $dimension[0]-55, 25)
Global $button = GUICtrlCreateButton("", $dimension[0]-35, 45, 25, 25)
; Mise à jour des composants graphiques
GUICtrlSetBkColor($title, -2) ; $GUI_BKCOLOR_TRANSPARENT = -2
GUICtrlSetFont($title, 15, 800)
GUICtrlSetState($input2, $GUI_HIDE)
GUISetState(@SW_SHOW, $GUI)
Local $stop = False, $hover = False, $pushed = False, $previous = ""
Do
; Traitement classique des événements
Local $msg = GUIGetMsg()
If @error = 0 Then
Switch $msg
Case -3 ; $GUI_EVENT_CLOSE = -3
$stop = True
Case $quit
$stop = True
EndSwitch
EndIf
; Traitement en boucle
Local $info = GUIGetCursorInfo($GUI)
If @error = 0 Then
; Item survolé
Switch $info[4]
Case $button ; Hover
If Not $hover Then
$hover = True
GUICtrlSetColor($input, 0xFF0000) ; Rouge = 0xFF0000
EndIf
Case Else ; Unhover
If $hover Then
$hover = False
GUICtrlSetColor($input, 0x000000) ; Noir = 0x000000
EndIf
EndSwitch
; Item appuyé
Local $cond = $hover And $info[2] And $info[4] = $button
If Not $pushed And $cond Then ; Appuyé
$pushed = True
GUICtrlSetState($input, $GUI_HIDE)
GUICtrlSetState($input2, $GUI_SHOW)
EndIf
If $pushed And Not $cond Then ; Relaché
$pushed = False
GUICtrlSetState($input2, $GUI_HIDE)
GUICtrlSetState($input, $GUI_SHOW)
EndIf
EndIf
; Changement dans l'input
If $previous <> GUICtrlRead($input) Then
$previous = GUICtrlRead($input)
GUICtrlSetData($input2, $previous)
EndIf
Until $stop
GUIDelete($GUI)
A bientôt !
PS: D'avance désolé pour la partie dégueulasse du code, je n'ai pas réussi à enlever le style $ES_PASSWORD du champ, donc "obligé" de faire deux inputs qui se chevauchent.
EDIT : Problème [R]ésolu en séparant les deux fonctionnements : généraliste pour le hover/unhover, et spécifique au bouton pour le push/release (cf _GuiCtrlButton_***).