[R] Problème avec l'UDF 'GUICtrlSetOnHover_UDF.au3'

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Morphee
Niveau 2
Niveau 2
Messages : 28
Enregistré le : mar. 16 févr. 2010 19:43
Status : Hors ligne

[R] Problème avec l'UDF 'GUICtrlSetOnHover_UDF.au3'

#1

Message par Morphee »

Bonjour,

Dernièrement je suis tombé sur ce post : http://www.autoitscript.com/forum/index ... 55120&st=0

C'était exactement ce dont j'avais besoin pour gérer une image dans ma GUI comme un bouton avec le remplacement de l'image (hover) quand la souris survole l'image.

La dernière version de l'UDF est la 1.8 mais j'ai dû modifier l'UDF pour qu'il fonctionne correctement car une erreur n'a pas été corrigé avec la version 3.3 de Autoit.

Remplacez : (Ligne 15)

Code : Tout sélectionner

Opt("OnExitFunc", "__GUICtrl_SetOnHover_OnAutoItExit")
dans l'UDF par :

Code : Tout sélectionner

OnAutoItExitRegister( "__GUICtrl_SetOnHover_OnAutoItExit")
Voir : http://autoitscript.fr/forum/viewtopic. ... ter#p28205

Dans mon script j'ai créer un menu avec "_GUICtrlMenu_CreateMenu ()".
Et je gère la sélection dans le sous-menu avec la fonction "WM_COMMAND".

Seulement voilà, dès que je déclare la fonction avec 'GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")' la gestion du clique ne fonctionne plus :?
Et si vous mettez en commentaire cette ligne le clique re-fonctionne....

Il y a donc quelque chose qui coince l'UDF dès que l'on déclare une fonction 'WM_COMMAND' mais quoi ?

Je vous ai fait un petit exemple sommaire de mon script mais fonctionnel (Sauf le Menu + clique) :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <GUIListBox.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <GUICtrlSetOnHover_UDF.au3>

; Variable pour le menu
Global Enum $idAddRec = 1000,  $idExit, $idAbout  ; $idOpen, $idSave, $idCut, $idCopy, $idPaste
Global $hGUI, $hFile, $hHelp, $hMain   ; $hEdit,

Local $listview, $hImage
Local $exStyles = BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_ONECLICKACTIVATE, $LVS_EX_INFOTIP )

Global $ImageIsClicked = False

$INTERFACE = GUICreate("OnHover sur IMAGE", 644, 439, -1, -1)

$Image1 = GUICtrlCreatePic(@ScriptDir & "\Play_Button.jpg", 521, 109, 83, 83)
_GUICtrl_SetOnHover(-1, "_Hover_Proc", "_Leave_Hover_Proc", "PrimaryDown_Proc", "PrimaryUp_Proc")

; Create File menu
$hFile = _GUICtrlMenu_CreateMenu ()
_GUICtrlMenu_InsertMenuItem ($hFile, 0, "&SousMenu", $idAddRec)
_GUICtrlMenu_InsertMenuItem ($hFile, 1, "", 0)
_GUICtrlMenu_InsertMenuItem ($hFile, 2, "E&xit", $idExit)
; Create Help menu
$hHelp = _GUICtrlMenu_CreateMenu ()
_GUICtrlMenu_InsertMenuItem ($hHelp, 0, "&About", $idAbout)
; Create Main menu
$hMain = _GUICtrlMenu_CreateMenu ()
_GUICtrlMenu_InsertMenuItem ($hMain, 0, "&Configurations", 0, $hFile)
_GUICtrlMenu_InsertMenuItem ($hMain, 1, "&Aide", 0, $hHelp)
; Set window menu
_GUICtrlMenu_SetMenu ($INTERFACE, $hMain)

;ICI la déclaration de la fonction $WM_COMMAND à mettre en commentaire pour que le clique fonctionne
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState(@SW_SHOW, $INTERFACE)


; Handle menu commands
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Switch _WinAPI_LoWord ($iwParam)
        Case $idAddRec
            ;Suite du script à partir du menu.....
            ConsoleWrite( "Menu selectionné" & @CRLF)
        Case $idExit
            Exit
        Case $idAbout
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

While 1
    $nMsg = GUIGetMsg()
    If $ImageIsClicked Then
        $ImageIsClicked = False
        ConsoleWrite( "LANCEMENT du SCRIPT" & @CRLF)
    EndIf
    Select
        Case $nMsg = $GUI_EVENT_CLOSE
            Exit
    EndSelect
WEnd

Func _Hover_Proc($iCtrlID)
    Switch $iCtrlID
        Case $Image1
            GUICtrlSetImage($iCtrlID, @ScriptDir & "\Play_Button_Hover.jpg")
    EndSwitch
EndFunc

Func _Leave_Hover_Proc($iCtrlID)
    Switch $iCtrlID
        Case $Image1
            GUICtrlSetImage($iCtrlID, @ScriptDir & "\Play_Button.jpg")
    EndSwitch
EndFunc

Func PrimaryDown_Proc($iCtrlID)
    ConsoleWrite( "DOWN_proc" & @CRLF)
    Switch $iCtrlID
        Case $Image1
            GUICtrlSetImage($iCtrlID, @ScriptDir & "\Play_Button_Click.jpg")
    EndSwitch
EndFunc

Func PrimaryUp_Proc($iCtrlID)
    ConsoleWrite( "UP_Proc" & @CRLF)
    Switch $iCtrlID
        Case $Image1
            GUICtrlSetImage($iCtrlID, @ScriptDir & "\Play_Button_Hover.jpg")
            $ImageIsClicked = True
    EndSwitch
EndFunc
 
Vous pouvez télécharger cet exemple avec les images et l'UDF corrigé ici :
Fichiers joints
GUICtrlSetOnHover - Exemple.zip
(14.53 Kio) Téléchargé 157 fois
Modifié en dernier par Morphee le mer. 03 mars 2010 11:44, modifié 1 fois.
Morphee
Niveau 2
Niveau 2
Messages : 28
Enregistré le : mar. 16 févr. 2010 19:43
Status : Hors ligne

Re: [..] Problème avec l'UDF 'GUICtrlSetOnHover_UDF.au3'

#2

Message par Morphee »

Bon bein finalement j'ai trouvé la solution en utilisant cet UDF : http://www.autoitscript.com/forum/index ... ntry240145
J'aurais aimer comprendre ce qui se passait mais ça marche maintenant alors c'est principal :D

Pour ceux que ça intéresse voici le code :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>

#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <GUIListBox.au3>

#include <GuiListView.au3>
#include <GuiImageList.au3>

#include <_ControlHover.au3>

; Variable pour le menu
Global Enum $idAddRec = 1000,  $idExit, $idAbout
Global $hGUI, $hFile, $hHelp, $hMain

Local $listview, $hImage
Local $exStyles = BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_ONECLICKACTIVATE, $LVS_EX_INFOTIP )



$INTERFACE = GUICreate("OnHover sur IMAGE", 644, 439, -1, -1)

$Image1 = GUICtrlCreatePic(@ScriptDir & "\Play_Button.jpg", 521, 109, 83, 83)
_ControlHover(2, "", $Image1)

; Create File menu
$hFile = _GUICtrlMenu_CreateMenu ()
_GUICtrlMenu_InsertMenuItem ($hFile, 0, "&SousMenu", $idAddRec)
_GUICtrlMenu_InsertMenuItem ($hFile, 1, "", 0)
_GUICtrlMenu_InsertMenuItem ($hFile, 2, "E&xit", $idExit)
; Create Help menu
$hHelp = _GUICtrlMenu_CreateMenu ()
_GUICtrlMenu_InsertMenuItem ($hHelp, 0, "&About", $idAbout)
; Create Main menu
$hMain = _GUICtrlMenu_CreateMenu ()
_GUICtrlMenu_InsertMenuItem ($hMain, 0, "&Configurations", 0, $hFile)
_GUICtrlMenu_InsertMenuItem ($hMain, 1, "&Aide", 0, $hHelp)
; Set window menu
_GUICtrlMenu_SetMenu ($INTERFACE, $hMain)

;ICI la déclaration de la fonction $WM_COMMAND à mettre en commentaire pour que le clique fonctionne
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState(@SW_SHOW, $INTERFACE)

; Handle menu commands
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Switch _WinAPI_LoWord ($iwParam)
        Case $idAddRec
            ;Suite du script à partir du menu.....
            ConsoleWrite( "Menu selectionné" & @CRLF)

        Case $idExit
            Exit

        Case $idAbout

    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

While 1
    $nMsg = GUIGetMsg()
    Select
        Case $nMsg = $GUI_EVENT_CLOSE
            Exit
    EndSelect
    $Over = _ControlHover(0, $INTERFACE) ; or _ControlHover() - or _ControlHover(0)
    If $Over = 1 Then
        $tempID = @extended
        If $tempID = $Image1 Then ConsoleWrite(  "You are over Button 1" & @CRLF)
    Else
        $tempID = @extended
        If $tempID = $Image1 Then ConsoleWrite(  "You are not over Button 1" & @CRLF)

    EndIf


    $Click = _ControlHover(1, $INTERFACE) ; or _ControlHover(1)
    If $Click = 1 And @extended = $Image1 Then
        ConsoleWrite(  'Button 1 was pressed' & @CRLF)
    EndIf

WEnd


Func _CheckHoverAndPressed()

    $CtrlId = _ControlHover(0)
    $tempID = @extended
    If $CtrlId = 1 Then
        _HoverFound($tempID)
    ElseIf $CtrlId = 0 Then
        _HoverLost($tempID)
    EndIf

    $CtrlId2 = _ControlHover(1)
    $tempID2 = @extended
    If $CtrlId2 = 1 Then
        _ButtonPressed($tempID2)
    ElseIf $CtrlId2 = 0 Then
        _ButtonReleased($tempID2)
    EndIf

EndFunc   ;==>_CheckHoverAndPressed

Func _HoverFound($ControlID)
    Switch $ControlID
        Case $Image1
            ConsoleWrite('Hover over Button 1   ' & @CRLF)

    EndSwitch
EndFunc   ;==>_HoverFound

Func _HoverLost($ControlID)
    Switch $ControlID
        Case $Image1
            ConsoleWrite('Hover *lost* Button 1   ' & @CRLF)

    EndSwitch
EndFunc   ;==>_HoverLost

Func _ButtonPressed($ControlID)
    Switch $ControlID
        Case $Image1
            ConsoleWrite('Pressed Button 1   ' & @CRLF)

    EndSwitch
EndFunc   ;==>_ButtonPressed

Func _ButtonReleased($ControlID)
    Switch $ControlID
        Case $Image1
            ConsoleWrite('Released Button 1   ' & @CRLF)
    EndSwitch
EndFunc   ;==>_ButtonReleased
Répondre