Picture als Button animiert

    • Offizieller Beitrag

    Hi,
    ich habe das Bsp. gerade im Hilfeboard gebracht, möchte es aber hier nochmals anbringen.
    Standardmäßig kann ich Button mit Icon oder Bitmap versehen - aber nicht mit GIF oder JPG.
    Wer also also ein Picture-Control als Button verwendet aber nicht auf den "Klick-Effekt" verzichten möchte, kann dafür diese Funktion nutzen.
    Um den Effekt zu erreichen verschiebe ich das Picture-Control und ändere seine Größe. Außerdem lege ich für die "Klickzeit" ein transparentes Fenster auf das Control.

    _AnimButton()
    [autoit]

    #include<WindowsConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<StaticConstants.au3>
    Global $pic = @SystemDir & '\oobe\images\nextover.jpg'

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate("Test",Default,Default,-1,-1)
    $btnPic = GUICtrlCreatePic($pic, 30, 40, 24, 24)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $btnPic
    _AnimButton($gui, $btnPic)
    MsgBox(0, '', 'click')
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _AnimButton($IDgui, $IDbtn [, $delay=150])
    ; Description: animiert ein Pic, wie einen geklickten Button
    ; Parameter(s): $IDgui ID der GUI
    ; $IDbtn ID des Picture als Button
    ; optional $delay Verzögerung Zustand geklickt/nicht geklickt, Standard 150 ms
    ;==================================================================================================
    Func _AnimButton($IDgui, $IDbtn, $delay=150)
    Local $pos = ControlGetPos($IDgui, '', $IDbtn)
    Local $pWin = WinGetPos($IDgui)
    ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1]+1, $pos[2]-1, $pos[3]-1)
    Local $tmpGui = GUICreate('', $pos[2], $pos[3], $pWin[0]+$pos[0], $pWin[1]+$pos[1]+20, $WS_POPUP)
    WinSetTrans($tmpGui, '', 120)
    GUISetState(@SW_SHOW, $tmpGui)
    Sleep($delay)
    GUIDelete($tmpGui)
    ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1], $pos[2], $pos[3])
    EndFunc ;==> _AnimButton

    [/autoit]
    • Offizieller Beitrag

    Spar dir diese Kommentare, die Funktion läuft auch unter Vista. Du mußt nur einen anderen Picture-Pfad angeben.
    (Wie wenig man selbst in Redmond von Vista hält, zeigt sich auch hier dran, dass auf das bisherige (in allen Windows-Varianten bestehende) System der Pfadintegrität verzichtet wurde :thumbdown: )

  • Hätte hier einen kleinen Änderungsvorschlag:
    GUIGetCursorInfo, sodass das Bild erst beim ButtonUp geklickt wird:
    Außerdem Stat dem zusammenaddieren von WinGetPos und CtrlGetPos: WinGetPos(GUICtrlGetHandle($IDBtn))

    Spoiler anzeigen
    [autoit]

    #include<WindowsConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<StaticConstants.au3>
    Global $pic = @SystemDir & '\oobe\images\nextover.jpg'

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate("Test",Default,Default,-1,-1)
    $btnPic = GUICtrlCreatePic($pic, 30, 40, 24, 24)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $btnPic
    If _AnimButton($gui, $btnPic) Then MsgBox(0, '', 'click')
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _AnimButton($IDgui, $IDbtn [, $delay=150])
    ; Description: animiert ein Pic, wie einen geklickten Button
    ; Parameter(s): $IDgui ID der GUI
    ; $IDbtn ID des Picture als Button
    ;==================================================================================================
    Func _AnimButton($IDgui, $IDbtn)
    Local $pos = ControlGetPos($IDgui, '', $IDbtn)
    Local $pWin = WinGetPos(GUICtrlGetHandle($IDbtn))
    ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1]+1, $pos[2]-1, $pos[3]-1)
    Local $tmpGui = GUICreate('', $pos[2], $pos[3], $pWin[0], $pWin[1], $WS_POPUP,$WS_EX_TOOLWINDOW)
    WinSetTrans($tmpGui, '', 120)
    GUISetState(@SW_SHOWNOACTIVATE, $tmpGui)
    $return = 1
    Do
    $x = GUIGetCursorInfo($IDgui)
    If $x[4] <> $IDbtn Then $return = 0
    Sleep(10)
    Until $x[2] = 0
    GUIDelete($tmpGui)
    ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1], $pos[2], $pos[3])
    Return $return
    EndFunc ;==> _AnimButton

    [/autoit]