Page 1 sur 1
[R] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 12:33
par Xtend
Bonjour,
Je souhaiterais réaliser une GUI avec quelques boutons, jusqu'à la, pas de problème

Cependant, je voudrais que ces boutons soit des images (.jpg, .png ou autres) et que lorsque qu'on passe la souris dessus, l'image change.
En résumé, ça consisterais à afficher une image lorsque la souris n'est pas dessus et à afficher une autre image lorsqu'elle est dessus (on pourrais aussi faire une troisième image lorsqu'on clique dessus).
J'ai vu une UDF capable de faire cela :
http://autoitscript.fr/forum/viewtopic.php?f=21&t=3672
Cependant, comme l'auteur le dit lui-même, de nombreux bugs font que le script bug (et en effet, chez moi, ça plante beaucoup ... mais bon, c'est exactement ce que je recherche).
Connaissez-vous le moyen de réaliser ceci ou les étapes à suivre ?
Merci d'avance

Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 16:56
par Xtend
Après moult recherches, j'ai finalement trouvé ce topic :
http://autoitscript.fr/forum/viewtopic.php?f=21&t=4174
C'est l'UDF qu'il me fallait, j'ai réarranger la ligne 24 en remplaçant AdlibEnable par AdlibRegister mais il m'affiche cette erreur :
► Afficher le texte
Code : Tout sélectionner
C:\function guictrlcreatepic_set_on_over\Pic_Set_On_Over.au3(30,25) : ERROR: _On_Over() called by a previous line with 0 arg(s). Min = 1. First previous line calling this Func is 24.
Func _On_Over($o_object)
~~~~~~~~~~~~~~~~~~~~~~~~^
C:\function guictrlcreatepic_set_on_over\Pic_Set_On_Over.au3 - 1 error(s), 0 warning(s)
Voici le code de l'UDF que j'ai utilisé :
► Afficher le texte
Code : Tout sélectionner
#include <WinAPI.au3>
Opt("GUICoordMode", 1)
Global $pic__down[1000], $pic__over[1000]
Func _GUICtrlCreatePic_Set_On_Over($pic_down, $pic_over, $left, $top, $width, $height)
If StringRight($pic_down, 3) <> "bmp" Then
If StringRight($pic_down, 3) <> "gif" Then
If StringRight($pic_down, 3) <> "jpg" Then
_Exit_Erreur("$pic_down (*.bmp,*.gif,*.jpg)")
EndIf
EndIf
EndIf
If StringRight($pic_over, 3) <> "bmp" Then
If StringRight($pic_over, 3) <> "gif" Then
If StringRight($pic_over, 3) <> "jpg" Then
_Exit_Erreur("$pic_over (*.bmp,*.gif,*.jpg)")
EndIf
EndIf
EndIf
If Not FileExists($pic_down) Then _Exit_Erreur($pic_down&" Not Exists")
If Not FileExists($pic_over) Then _Exit_Erreur($pic_over&" Not Exists")
Global $o_object = GUICtrlCreatePic($pic_down, $left, $top, $width, $height)
GUISetState()
AdlibRegister("_On_Over", 50)
$pic__down[$o_object] = $pic_down
$pic__over[$o_object] = $pic_over
return $o_object
EndFunc
Func _On_Over($o_object)
For $oo_object = 0 To $o_object
Local $mousepos = GUIGetCursorInfo()
If @error Then
Else
Select
Case $mousepos[4] = $oo_object And $mousepos[2] = 1
GUICtrlSetImage($oo_object, $pic__down[$oo_object])
Case $mousepos[4] = $oo_object And $mousepos[2] = 0
GUICtrlSetImage($oo_object, $pic__over[$oo_object])
Case $mousepos[4] <> $oo_object
GUICtrlSetImage($oo_object, $pic__down[$oo_object])
EndSelect
EndIf
Next
EndFunc
func _Exit_Erreur($text)
Return _WinAPI_ShowError($text)
EndFunc
Et mon script (enfin c'est celui du topic ou je l'ai pris ^^) :
► Afficher le texte
Code : Tout sélectionner
#AutoIt3Wrapper_Au3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
Opt('MustDeclareVars', 1)
#include <GUIConstantsEx.au3>
#include <Pic_Set_On_Over.au3>
Global $hWnd0 = GUICreate("CalAgenda", 235, 250)
Pic_Set_On_Over()
func Pic_Set_On_Over()
GUISetBkColor(0x424242)
Local $back1 = _GUICtrlCreatePic_Set_On_Over("back.bmp", "backover.bmp", 180, 11, 41, 23)
Local $next1 = _GUICtrlCreatePic_Set_On_Over("next.bmp", "nextover.bmp", 180, 51, 41, 23)
Local $next2 = _GUICtrlCreatePic_Set_On_Over("next.jpg", "nextover.jpg", 180, 91, 24, 24)
Local $exit = _GUICtrlCreatePic_Set_On_Over("exit.gif", "exitover.gif", 180, 131, 20, 20)
GUISetState()
While 1
Switch GUIGetMsg()
case $GUI_EVENT_CLOSE
Exit
case $back1
MsgBox(0, "", "back.bmp")
Case $next1
MsgBox(0, "", "Next.bmp")
Case $next2
MsgBox(0, "", "Next.jpg")
case $exit
MsgBox(0, "", "exit.gif")
Exit
EndSwitch
WEnd
EndFunc
Pouvez-vous m'aider à résoudre mon problème ?
Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 17:07
par pierrotm777
J'ai l'impression que l'erreur indique un appel à la fonction _On_Over avec 0 objet puis avec un objet .
Il semblerait donc qu'il n'aime pas le Adlibregister car l'objet n'y est pas indiqué .
Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 17:24
par Xtend
En effet, c'est bien cela (enfin, je pense)
J'avais essayé en l'enlevant mais ça marchait pas (le script se lançait mais les boutons étaient pas "interactifs").
Savez-vous comment résoudre le problème ?
Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 17:28
par pierrotm777
Je pense avoir trouvé une solution :
Dans l'UDF, je vous propose de commenter le Adlibregister
De remplacer :
par:
Code : Tout sélectionner
Global $pic__down[1000], $pic__over[1000],$timer = TimerInit (),$diff,$o_object
► Afficher le texte
Code : Tout sélectionner
#include <WinAPI.au3>
Opt("GUICoordMode", 1)
Global $pic__down[1000], $pic__over[1000],$timer = TimerInit (),$diff
Func _GUICtrlCreatePic_Set_On_Over($pic_down, $pic_over, $left, $top, $width, $height)
If StringRight($pic_down, 3) <> "bmp" Then
If StringRight($pic_down, 3) <> "gif" Then
If StringRight($pic_down, 3) <> "jpg" Then
_Exit_Erreur("$pic_down (*.bmp,*.gif,*.jpg)")
EndIf
EndIf
EndIf
If StringRight($pic_over, 3) <> "bmp" Then
If StringRight($pic_over, 3) <> "gif" Then
If StringRight($pic_over, 3) <> "jpg" Then
_Exit_Erreur("$pic_over (*.bmp,*.gif,*.jpg)")
EndIf
EndIf
EndIf
If Not FileExists($pic_down) Then _Exit_Erreur($pic_down&" Not Exists")
If Not FileExists($pic_over) Then _Exit_Erreur($pic_over&" Not Exists")
Global $o_object = GUICtrlCreatePic($pic_down, $left, $top, $width, $height)
GUISetState()
; AdlibRegister("_On_Over", 50)
$pic__down[$o_object] = $pic_down
$pic__over[$o_object] = $pic_over
return $o_object
EndFunc
Func _On_Over($o_object)
For $oo_object = 0 To $o_object
Local $mousepos = GUIGetCursorInfo()
If @error Then
Else
Select
Case $mousepos[4] = $oo_object And $mousepos[2] = 1
GUICtrlSetImage($oo_object, $pic__down[$oo_object])
Case $mousepos[4] = $oo_object And $mousepos[2] = 0
GUICtrlSetImage($oo_object, $pic__over[$oo_object])
Case $mousepos[4] <> $oo_object
GUICtrlSetImage($oo_object, $pic__down[$oo_object])
EndSelect
EndIf
Next
EndFunc
func _Exit_Erreur($text)
Return _WinAPI_ShowError($text)
EndFunc
Puis de modifier votre script ainsi !
► Afficher le texte
Code : Tout sélectionner
#AutoIt3Wrapper_Au3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
Opt('MustDeclareVars', 1)
#include <GUIConstantsEx.au3>
#include <Pic_Set_On_Over.au3>
Global $hWnd0 = GUICreate("CalAgenda", 235, 250)
Pic_Set_On_Over()
func Pic_Set_On_Over()
GUISetBkColor(0x424242)
Local $back1 = _GUICtrlCreatePic_Set_On_Over("back.bmp", "backover.bmp", 180, 11, 41, 23)
Local $next1 = _GUICtrlCreatePic_Set_On_Over("next.bmp", "nextover.bmp", 180, 51, 41, 23)
Local $next2 = _GUICtrlCreatePic_Set_On_Over("next.jpg", "nextover.jpg", 180, 91, 24, 24)
Local $exit = _GUICtrlCreatePic_Set_On_Over("exit.gif", "exitover.gif", 180, 131, 20, 20)
GUISetState()
While 1
$diff = TimerDiff($Timer)
if $diff>50 then
_On_Over($o_object)
$Timer = TimerInit()
EndIf
Switch GUIGetMsg()
case $GUI_EVENT_CLOSE
Exit
case $back1
MsgBox(0, "", "back.bmp")
Case $next1
MsgBox(0, "", "Next.bmp")
Case $next2
MsgBox(0, "", "Next.jpg")
case $exit
MsgBox(0, "", "exit.gif")
Exit
EndSwitch
WEnd
EndFunc
Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 17:42
par Xtend
Ben dis-donc quel rapidité !
Le problème venait bien de la donc je te remercie beaucoup pour ton aide.
Maintenant, il ne me reste plus, qu'à faire en sorte de rajouter une troisième image pour quand on clique dessus.
J'imagine qu'il faut faire ça avec des "Case", non ?
Si ce n'est pas ça, pourrais-tu m'indiquer comment m'y prendre, ce serait très gentil de ta part

Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 17:58
par pierrotm777
Vous avez déjà 4 exemple de boutons créés avec la fonction _GUICtrlCreatePic_Set_On_Over
Vous pouvez donc créer autant de bouton dont vous avez besoin :
Local $boutonnouveau1 = _GUICtrlCreatePic_Set_On_Over("exit.gif", "exitover.gif", 180, 131, 20, 20)
Il faudra juste le placer là où vous en avez besoin :
Code : Tout sélectionner
_GUICtrlCreatePic_Set_On_Over("nom image", "nom image au passage de la souris", position x, position y, taille x en pixel, taille y en pixel)
puis pour chaque nouveau bouton , ajoutez effectivement un nouveau case qui indiquera l'action à réaliser.
Code : Tout sélectionner
case $boutonnouveau1
MsgBox(0, "HAL Info", "I am sorry Dave, I can't do that !")

Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 18:04
par Xtend
Si j'ai bien compris, votre méthode consisterai à changer l'image lorsque qu'on clique dessus par un "Case".
Cependant, je pense qu'il est possible de modifier l'UDF de façon à écrire :
Code : Tout sélectionner
_GUICtrlCreatePic_Set_On_Over("nom image", "nom image au passage de la souris", [color=#FF0000][b]"nom image au clic"[/b][/color], position x, position y, taille x en pixel, taille y en pixel)
Mais je sais pas comment m'y prendre

Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 18:28
par pierrotm777
Ici l'image ne change qu'au passage de la souris sur le bouton !
Je vous conseil de créer deux objets pour un nouveau bouton avec votre éditeur graphique préféré :
Par exemple, copiez next.jpg en bouton1.jpg et nextover.jpg par boutonover1.jpg et éditez les , puis modifiez les selon votre besoin .
Vous pouvez aussi trouver des boutons sur le net un peu partout et les renommer !
Une fois ces deux graphiques créés, il vous reste à créer le bouton.
Si vous regardez bien les boutons, ils sont, ici, espacés de 40 pixels!
Le bouton le plus bas étant le bouton $exit, placé en x=180,y=131 et de taille x=20,y=20
Code : Tout sélectionner
Local $exit = _GUICtrlCreatePic_Set_On_Over("exit.gif", "exitover.gif", 180, 131, 20, 20)
Le nouveau bouton pourrais donc être par exemple décalé de 40 pixels, ce qui donnerais:
Code : Tout sélectionner
Local $bouton1 = _GUICtrlCreatePic_Set_On_Over("bouton1.jpg", "boutonover1.jpgf", 180, 171, 20, 20)
Re: [..] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 18:48
par Xtend
Je crois que vous avez pas compris ma question ou je me suis mal exprimé.
Je ne chercher pas à créer d'autres boutons pour l'instant, je cherche juste à en faire un.
Je vais essayer des résumer ce que je veux faire afin que ce soit plus compréhensible :
Il y a trois étapes importantes chez la vie d'un bouton (en ayant un peu d'imagination ^^) :
- le premier, c'est la création (lors du lancement du script)
- le second, c'est le passage de la souris
- le troisième, c'est le clic par la souris (actionnant donc une action)
Mais bon, j'ai réussi à modifier l'UDF en créant la variable $pic_surover et ça à l'air de marcher.
J'ai rajouté la "Case" avec
Code : Tout sélectionner
Case $msg = $oo_object
GUICtrlSetImage($oo_object, $pic__surover[$oo_object])
Voici le code :
► Afficher le texte
Code : Tout sélectionner
#include <WinAPI.au3>
Opt("GUICoordMode", 1)
Global $pic__down[1000], $pic__over[1000], $pic__surover[1000],$timer = TimerInit (),$diff , $msg
Func _GUICtrlCreatePic_Set_On_Over($pic_down, $pic_over, $pic_surover, $left, $top, $width, $height)
If StringRight($pic_down, 3) <> "bmp" Then
If StringRight($pic_down, 3) <> "gif" Then
If StringRight($pic_down, 3) <> "jpg" Then
_Exit_Erreur("$pic_down (*.bmp,*.gif,*.jpg)")
EndIf
EndIf
EndIf
If StringRight($pic_over, 3) <> "bmp" Then
If StringRight($pic_over, 3) <> "gif" Then
If StringRight($pic_over, 3) <> "jpg" Then
_Exit_Erreur("$pic_over (*.bmp,*.gif,*.jpg)")
EndIf
EndIf
EndIf
If StringRight($pic_surover, 3) <> "bmp" Then
If StringRight($pic_surover, 3) <> "gif" Then
If StringRight($pic_surover, 3) <> "jpg" Then
_Exit_Erreur("$pic_surover (*.bmp,*.gif,*.jpg)")
EndIf
EndIf
EndIf
If Not FileExists($pic_down) Then _Exit_Erreur($pic_down&" Not Exists")
If Not FileExists($pic_over) Then _Exit_Erreur($pic_over&" Not Exists")
If Not FileExists($pic_surover) Then _Exit_Erreur($pic_surover&" Not Exists")
Global $o_object = GUICtrlCreatePic($pic_down, $left, $top, $width, $height)
GUISetState()
$pic__down[$o_object] = $pic_down
$pic__over[$o_object] = $pic_over
$pic__surover[$o_object] = $pic_surover
return $o_object
EndFunc
Func _On_Over($o_object)
For $oo_object = 0 To $o_object
$msg = GUIGetMsg()
Local $mousepos = GUIGetCursorInfo()
If @error Then
Else
Select
Case $mousepos[4] = $oo_object And $mousepos[2] = 1
GUICtrlSetImage($oo_object, $pic__down[$oo_object])
Case $mousepos[4] = $oo_object And $mousepos[2] = 0
GUICtrlSetImage($oo_object, $pic__over[$oo_object])
Case $mousepos[4] <> $oo_object
GUICtrlSetImage($oo_object, $pic__down[$oo_object])
Case $msg = $oo_object
GUICtrlSetImage($oo_object, $pic__surover[$oo_object])
EndSelect
EndIf
Next
EndFunc
func _Exit_Erreur($text)
Return _WinAPI_ShowError($text)
EndFunc
Je passe le problème en résolu.
@ pierrotm777 : je te remercie pour ton aide

Re: [R] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 20:06
par matwachich
Bon, je sais que le sujet est résolu mais je vous donne 2 liens qui m'ont permis de faire exactement ce que tu veut
http://www.autoitscript.com/forum/topic ... hover-udf/
http://www.autoitscript.com/forum/topic ... icons-au3/
Re: [R] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 21:21
par Xtend
Ben, pas tout à fait résolu car je n'arrive pas à faire afficher une background à cette UDF lorsque la souris passe sur le bouton
J'avais déjà vu le second mais pas le premier, je pense que je vais m'en servir :p
Merci pour ta participation

Re: [R] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 21:43
par matwachich
Ya pas de quoi!
Je comptai faire un UDF de création de boutons exactement comme tu les demandes, sauf qu'il sera basé sur des fichiers icone, et pas png ou jpg, car la transparence est plus simple à gérer.
Grosso-modo, je fais comme cela (exemple 2 de l'UDF icons.au3):
Code : Tout sélectionner
GUICreate('Example2', 216, 128)
$Icon = GUICtrlCreateIcon('', 0, 40, 40, 48, 48)
_GuiCtrlSetOnHover(-1, '_change', '_change')
GUISetState()
_SetIcon($Icon, 'icon_normale', 0, 48, 48)
Do
Sleep(100)
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func _change($hCtrl, $iFlag, $hWin)
Switch $iFlag
Case 1
_SetIcon($hCtrl, 'icon_normale', 0, 48, 48)
Case 2
_SetIcon($hCtrl, 'icon_hover', 0, 48, 48)
EndSwitch
EndFunc
GUIDelete()
PS: j'ai peut être inversé les case de $iFlag (voir la doc. de l'UDF OnHover)
Quand l'UDF sera prêt, je posterai un lien ici!
Re: [R] Réaliser un bouton "interactif"
Posté : lun. 14 mars 2011 22:26
par Xtend
Ok, je te souhaite bonne chance pour ton UDF

Dommage que tu te contente seulement des icônes (ce qui est déjà pas mal faut avouer ^^).
Re: [R] Réaliser un bouton "interactif"
Posté : jeu. 17 mars 2011 20:45
par matwachich
En effet, je me contente d'icones, mais je créer d'abord mon image sous GIMP en png puis j'utilise SimplyIcon (google) qui est pas mal et très simple
Sinon,
voici l'UDF
Re: [R] Réaliser un bouton "interactif"
Posté : jeu. 17 mars 2011 21:24
par Xtend
Salut,
Ben j'ai testé ton UDF et il marche pas chez moi.
J'ai donc ouvert les fichiers au3, je me suis rendu compte que :
- 1) tu mettais tes fichiers dans un dossier "perso" (exemple : #include <perso\Icons.au3>) donc j'ai supprimé le dossier "perso" étant donné que j'inclue les UDF directement dans le dossier "Include". Cependant, ça marchait pas non plus.
- 2) Tu mets l'include :
#include <GUICtrlOnHover.au3>
or dans le dossier include de AutoIt, il existe :
#include <GUICtrlSetOnHover.au3>
Est-ce une erreur d'écriture ou une UDF que tu as oubliés de mettre dans zip ?
Je pencherais plutôt pour une UDF car tu l'avais mis dans le dossier "perso". Si tel est le cas, merci de le mettre dans ton zip pour ceux qui comme moi, ne l'ont pas.
- 3) En remplaçant l'include, j'ai l'erreur suivante :
► Afficher le texte
Code : Tout sélectionner
C:\Program Files (x86)\AutoIt3\Include\GUICtrlSetOnHover.au3(15,107) : ERROR: Opt() called with illegal argument 1: "OnExitFunc"
Global $__GUICtrl_SetOnHover_sOriginal_OnExitFunc = Opt("OnExitFunc", "__GUICtrl_SetOnHover_OnAutoItExit")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\UDF_3StatIcon\3StatIcon.au3(41,73) : ERROR: _GUICtrl_OnHoverRegister(): undefined function.
"__3StatIcon_OnClickFunction", "__3StatIcon_OnClickFunction", 0)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\UDF_3StatIcon\3StatIcon.au3 - 2 error(s), 0 warning(s)
J'espère que tu solutionneras ces bugs
