[R] GUICtrlOnHover et SplashTextOn

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
pumilio
Niveau 3
Niveau 3
Messages : 38
Enregistré le : lun. 03 déc. 2012 16:59
Status : Hors ligne

[R] GUICtrlOnHover et SplashTextOn

#1

Message par pumilio »

bonjour à tous,

je rencontre une difficulté avec l'UDF "GUICtrlOnHover" que j'utilise souvent.
Mes "SplashText" restent désespérément vides. Plutôt qu'une longue explication, voici un script basique qui illustre mon problème.
Si quelqu'un a une explication et/ou solution je suis preneur.
Merci d'avance pour votre aide.

Code : Tout sélectionner

#include <GUIConstants.au3>
#Include "GUICtrlOnHover.au3"

$Gui = GUICreate("Titre", 200, 120)
$bt1 = GUICtrlCreateLabel("Bouton", 50,40, 80, 26)
_GUICtrlSetOnHover($bt1, "_btIn", "_btOut", "_btClic", "_btRelache")

GUISetState(@SW_SHOW, $Gui)

While 1
    $msg = GUIGetMsg()
    If $msg == $GUI_EVENT_CLOSE Then
		ExitLoop
	EndIf
WEnd

Func _btRelache($CtrlID, $Param, $Param2)
	If $CtrlID = $bt1 Then
		SplashTextOn ( "test", "Affichage du texte" , 460 , 50 , -1, 200)
		Sleep(5000)
		SplashOff()
	EndIf
EndFunc
Modifié en dernier par pumilio le jeu. 17 avr. 2025 09:24, modifié 1 fois.
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 136
Enregistré le : ven. 17 avr. 2020 01:23
Localisation : Montréal, Québec
Status : Hors ligne

Re: [..] GUICtrlOnHover et SplashTextOn

#2

Message par Nine »

Tel que mentionné dans le fichier d'aide de AutoIt :
Warning: blocking of running user functions which executes window messages with commands such as "MsgBox()" can lead to unexpected behavior, the return to the system should be as fast as possible !!!
SplashTextOn fait partie des fonctions bloquantes. L'UDF dont tu fais référence utilise justement un timer basé sur des messages Windows.
En déléguant l'exécution du splash à un contrôle dummy, ça règle le problème car il n'y a pas fonction bloquante impliquée.

Voici le code qui fonctionne :

Code : Tout sélectionner

#include <GUIConstants.au3>
#include "GUICtrlOnHover.au3"

$Gui = GUICreate("Titre", 200, 120)
$bt1 = GUICtrlCreateLabel("Bouton", 50, 40, 80, 26)
_GUICtrl_OnHoverRegister($bt1, "", "", "", "_btRelache")

GUISetState()
Local $idDummy = GUICtrlCreateDummy()

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      ExitLoop
    Case $idDummy
      SplashTextOn ( "test", "Affichage du texte" , 460 , 50 , -1, 200)
      Sleep(5000)
  		SplashOff()
  EndSwitch

WEnd

Func _btRelache($CtrlID, $Param, $Param2)
  If $CtrlID = $bt1 Then
    GUICtrlSendToDummy($idDummy)
  EndIf
EndFunc   ;==>_btRelache
Mais je ne comprends pas pourquoi utiliser un UDF aussi compliqué (pas particulièrement bien écrit) pour faire une chose aussi simple :

Code : Tout sélectionner

#include <GUIConstants.au3>

$Gui = GUICreate("Titre", 200, 120)
$bt1 = GUICtrlCreateLabel("Bouton", 50, 40, 80, 26)

GUISetState()

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      ExitLoop
    Case $bt1
      SplashTextOn ( "test", "Affichage du texte" , 460 , 50 , -1, 200)
      Sleep(5000)
  		SplashOff()
  EndSwitch

WEnd
pumilio
Niveau 3
Niveau 3
Messages : 38
Enregistré le : lun. 03 déc. 2012 16:59
Status : Hors ligne

Re: [..] GUICtrlOnHover et SplashTextOn

#3

Message par pumilio »

Merci beaucoup Nine pour ces 2 solutions qui répondent parfaitement à ma demande.
J'utilise l'UDF "GUICtrlOnHover" pour les possibilités qu'il m'offre au niveau du visuel de mes boutons lors des différentes actions avec la souris (in, out, clic, release) .
Je n'ai pas fait apparaitre cela dans mon exemple de code pour qu'il reste succinct.
Mais s'il existe une façon plus "propre" d'obtenir ces effets visuels je suis preneur de suggestions car je t'accorde que c'est fastidieux à mettre en place et pas toujours très propre.
Tu relances d'ailleurs mon envie de trouver mieux. Je laisse ce sujet ouvert si quelqu'un a une idée. À moins qu'il soit préférable que j'ouvre un autre fil de discussion pour ne pas tout mélanger :? .

Bonne journée,
pumilio
Niveau 3
Niveau 3
Messages : 38
Enregistré le : lun. 03 déc. 2012 16:59
Status : Hors ligne

Re: [..] GUICtrlOnHover et SplashTextOn

#4

Message par pumilio »

Pour faire suite à mon message précédent, voici ce que me permet de faire visuellement GUICtrlOnHover (c'est un tout petit exemple).
Existe t-il d'autres façon plus "conventionnelles" d'obtenir des visuels de bouton de style "flat", un peu plus moderne que les boutons classiques GUICtrlCreateButton ?
Merci d'avance.

Code : Tout sélectionner

#include <GUIConstants.au3>
#Include "GUICtrlOnHover.au3"

$Gui = GUICreate("Titre", 280, 170)
$bt1 = GUICtrlCreateLabel("BOUTON 1", 10,20, 260, 55, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetCursor(-1, 0)
GUICtrlSetBkColor(-1, 0x4BA9DF)
_GUICtrlSetOnHover($bt1, "_btIn", "_btOut", "_btClic", "_btRelache")

$bt2Cadre = GUICtrlCreateLabel("", 10, 90, 260, 55)
GUICtrlSetBkColor(-1, 0x4BA9DF)
GUICtrlSetCursor(-1, 0)
_GUICtrlSetOnHover($bt2Cadre, "_btIn", "_btOut", "_btClic", "_btRelache")
$bt2 = GUICtrlCreateLabel("BOUTON 2", 15, 95, 250, 45, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0x4BA9DF)

GUISetState()
Local $idDummy = GUICtrlCreateDummy()

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      ExitLoop
    Case $idDummy
      SplashTextOn ( "test", "Affichage du texte" , 460 , 50)
      Sleep(5000)
      SplashOff()
  EndSwitch
WEnd

Func _btIn($CtrlID, $Param, $Param2)
	If $CtrlID = $bt1 Then
		GUICtrlSetBkColor($CtrlID, 0xB4D1E2)
	EndIf
	If $CtrlID = $bt2Cadre Then
		GUICtrlSetBkColor($CtrlID, 0x315ca2)
	EndIf
EndFunc ;==>_btIn
Func _btOut($CtrlID, $Param, $Param2)
		GUICtrlSetBkColor($CtrlID, 0x4BA9DF)
EndFunc ;==>_btOut
Func _btRelache($CtrlID, $Param, $Param2)
	If $CtrlID = $bt1 Then
		GUICtrlSendToDummy($idDummy)
	EndIf
	If $CtrlID = $bt2Cadre Then
		Exit
	EndIf
EndFunc   ;==>_btRelache
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 136
Enregistré le : ven. 17 avr. 2020 01:23
Localisation : Montréal, Québec
Status : Hors ligne

Re: [..] GUICtrlOnHover et SplashTextOn

#5

Message par Nine »

Je vois. C'est pas très compliqué à réaliser. J'utilise beaucoup la technique de SubClassing. C'est extrêmement intéressant car il intercepte TOUS les messages d'un contrôle (pas seulement ceux de l'UDF que tu utilises). À court/moyen terme, tu vas constater à quel point c'est facile à mettre en place et très puissant. Mais comme toute chose, il y a une petite courbe d'apprentissage. Voici ce que ça donne dans ton cas :

Code : Tout sélectionner

#include <WinAPIShellEx.au3>
#include <WinAPISys.au3>
#include <GUIConstants.au3>

Global $hProc = DllCallbackRegister(SubClassProc, 'lresult', 'hwnd;uint;wparam;lparam;uint_ptr;dword_ptr')
Global $hGUI = GUICreate("Titre", 280, 170)
Global $bt1 = GUICtrlCreateLabel("BOUTON 1", 10, 20, 260, 55, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetCursor(-1, 0)
GUICtrlSetBkColor(-1, 0x4BA9DF)
_WinAPI_SetWindowSubclass(GUICtrlGetHandle($bt1), DllCallbackGetPtr($hProc), $bt1)

Global $bt2Cadre = GUICtrlCreateLabel("", 10, 90, 260, 55)
GUICtrlSetBkColor(-1, 0x4BA9DF)
GUICtrlSetCursor(-1, 0)
_WinAPI_SetWindowSubclass(GUICtrlGetHandle($bt2Cadre), DllCallbackGetPtr($hProc), $bt2Cadre)

Global $bt2 = GUICtrlCreateLabel("BOUTON 2", 15, 95, 250, 45, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0x4BA9DF)

GUISetState()
Global $idDummy = GUICtrlCreateDummy()

While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      ExitLoop
    Case $idDummy
      If GUICtrlRead($idDummy) = 2 Then ExitLoop
      SplashTextOn("test", "Affichage du texte", 460, 50)
      Sleep(5000)
      SplashOff()
  EndSwitch
WEnd

_WinAPI_RemoveWindowSubclass(GUICtrlGetHandle($bt1), DllCallbackGetPtr($hProc), $bt1)
_WinAPI_RemoveWindowSubclass(GUICtrlGetHandle($bt2Cadre), DllCallbackGetPtr($hProc), $bt2Cadre)
DllCallbackFree($hProc)

Func SubClassProc($hWnd, $iMsg, $wParam, $lParam, $iID, $iData)
  Local Static $bHover = False
  Switch $iMsg
    Case $WM_MOUSEMOVE
      If Not $bHover Then
        _WinAPI_TrackMouseEvent($hWnd, $TME_LEAVE, 5)
        GUICtrlSetBkColor($iID, $iID = $bt1 ? 0xB4D1E2 : 0x315CA2)
        $bHover = True
      EndIf
    Case $WM_MOUSELEAVE
      GUICtrlSetBkColor($iID, 0x4BA9DF)
      $bHover = False
    Case $WM_LBUTTONUP
      GUICtrlSendToDummy($idDummy, $iID = $bt1 ? 1 : 2)
  EndSwitch
  Return _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>SubClassProc
Par ailleurs, si ça peut t'intéresser, j'ai mis en place un UDF pour composer des GUIs avec des coins ronds. Voir ici.
pumilio
Niveau 3
Niveau 3
Messages : 38
Enregistré le : lun. 03 déc. 2012 16:59
Status : Hors ligne

Re: [..] GUICtrlOnHover et SplashTextOn

#6

Message par pumilio »

Ouaouh ! Merci beaucoup pour cette façon de procéder. Il va effectivement me falloir un peu de temps pour la prendre en main correctement et comprendre comment ça fonctionne :oops: .
Ton UDF pour composer des GUIs avec des coins ronds m'intéresse également beaucoup. Le visuel des interfaces est effectivement important pour moi.

Encore merci.
Répondre