Transparente GIF als Button nutzen

    • Offizieller Beitrag

    Bisher habe ich das immer als Einzellösung neu geschrieben - nun in einer UDF verpackt.
    Es lassen sich GIFs mit Transparenz als Schaltflächen verwenden, bei Klick wird das Buttonverhalten auch in der Darstellung simuliert

    Aufgrund des internen Handlings ist zur Nutzung zwingend der OnEventMode erforderlich!

    Folgende Funktionen stehen zur Verfügung:

    _GUICtrl_TransGifButton_Create
    Erstellt aus einem transparenten GIF ein Button-Control, dass bei Klick buttontypisch animiert wird
    Die Anzahl der erstellbaren Button ist z.Zt. auf 255 begrenzt.

    _GUICtrl_TransGifButton_Show
    Macht alle erstellten GIF-Button sichtbar

    _GUICtrl_TransGifButton_GetMsg
    Gibt den String-Identifier des geklickten GIF-Button zurück

    _GUICtrl_TransGifButton_SetImage
    Setzen eines neuen Images für einen GIF-Button

    Hier ein Bsp. (Binärdaten gekürzt, im Anhang kpl.)

    Spoiler anzeigen
    [autoit]

    #Region - TimeStamp
    ; 2011-08-24 17:41:41
    #EndRegion - TimeStamp

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

    #include <GUIConstantsEx.au3>
    #include 'TransGifButton.au3'

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

    Opt('GuiOnEventMode', 1)

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

    #region - Transparente Bild-Datei
    OnAutoItExitRegister("_DelBinaryTempFiles")
    ; == Picture binär
    Global $aBin[3], $aPictFile[3]
    $aBin[0] = "0x47494638396130003000F7000000000062440E6365397F7624616F427A7C6B3E7ECA417CC118BA7824C6793DDB7F7EAD6F52D07E5E89AC5CB7857182807F9D9C729DAD64BA8675A5B5478BDC498CD.."
    $aPictFile[0] = @ScriptDir & "\tmp_pict_0.gif"
    $aBin[1] = "0x47494638396130003000F70000000000153E0C1F5B0A3B5F382668072A700E357C1833672E3975383D7C31437D1C4A7C2449484950524F5153515958576A6A696F6D6A7173717574737B7A777D7D7.."
    $aPictFile[1] = @ScriptDir & "\tmp_pict_1.gif"
    $aBin[2] = "0x47494638396130003000F700000000001E4F65364E59384F5A38505B3B535D20516624546929596E2C5C72335D6F3F566031607636657A3B617238677C39687D4259644960694A636E4B646F4C626.."
    $aBin[2] &= "00270C6287513C4354CEC0850B6EA00639F802136C48820B14718B5D1401978B78C43527400146AC22164BDC64307D63102CEC424BD928C50B92A00636AC41093368C02550A10A13E811038AD0C32F.."
    $aPictFile[2] = @ScriptDir & "\tmp_pict_2.gif"

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

    For $i = 0 To 2
    Local $hFileOut = FileOpen($aPictFile[$i], 2+8+16)
    FileWrite($hFileOut, Binary($aBin[$i]))
    FileClose($hFileOut)
    Next

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

    Func _DelBinaryTempFiles()
    For $i = 0 To 2
    FileDelete($aPictFile[$i])
    Next
    EndFunc
    #endregion - Transparente Bild-Datei

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

    $guiMain = GUICreate('Main', 400, 300, 200, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_exit', $guiMain)
    GUISetBkColor(0xFFFFAA, $guiMain)

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

    $GifButton1 = _GUICtrl_TransGifButton_Create($guiMain, '_ImageClick', $aPictFile[0], 60, 126, 48, 48)
    $GifButton2 = _GUICtrl_TransGifButton_Create($guiMain, '_ImageClick', $aPictFile[1], 176, 126, 48, 48, $WS_BORDER)
    $GifButton3 = _GUICtrl_TransGifButton_Create($guiMain, '_ImageClick', $aPictFile[2], 292, 126, 48, 48, $WS_THICKFRAME)

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

    _GUICtrl_TransGifButton_Show()
    GUISetState(@SW_SHOW, $guiMain)

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

    $t = TimerInit()
    While 1
    Sleep(50)
    If TimerDiff($t) >= 3000 Then
    _GUICtrl_TransGifButton_SetImage($GifButton1, $aPictFile[2])
    EndIf
    WEnd

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

    Func _exit()
    Exit
    EndFunc

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

    Func _ImageClick()
    Switch _GUICtrl_TransGifButton_GetMsg()
    Case $GifButton1
    MsgBox(0, '', 'Picture-Button 1 geklickt')
    Case $GifButton2
    MsgBox(0, '', 'Picture-Button 2 geklickt')
    Case $GifButton3
    MsgBox(0, '', 'Picture-Button 3 geklickt')
    EndSwitch
    EndFunc

    [/autoit]
    TransGifButton.au3 v1.0
    [autoit]

    #Region - TimeStamp
    ; 2011-08-24 18:00:01 v 1.0
    #EndRegion - TimeStamp
    #include-once
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    ;===============================================================================
    ; Function Name....: _GUICtrl_TransGifButton_Create
    ; Description......: Erstellt aus einem transparenten GIF ein Button-Control, dass bei Klick buttontypisch animiert wird
    ; Parameter(s).....: $hWndMain Handle des Fensters auf dem der Button erstellt wird
    ; $sFunc Funktion, die bei Klick auf den Button ausgeführt wird
    ; $sPathGIF Pfad zur GIF-Datei
    ; $iX x-Position auf der GUI
    ; $iY y-Position auf der GUI
    ; $iW Breite des Button
    ; $iH Höhe des Button
    ; $iStyle Wenn gewünscht, kann mit $WS_THICKFRAME oder $WS_BORDER kombiniert werden
    ; Requirement(s)...: Um den Button zu sehen, muß vor oder nach @SW_SHOW der GUI die Funktion "_GUICtrl_TransGifButton_Show()" aufgerufen werden
    ; Return Value(s)..: Erfolg String-Identifier, der die Auswertung über "_GUICtrl_TransGifButton_GetMsg()" ermöglicht
    ; Fehler 0 @error 1 - Mainwindow existiert nicht
    ; 2 - Imagepfad existiert nicht
    ; Note.............: Der Button registriert nur Klicks, die das Bild treffen! Ein Klick in den transparenten Bereich wird nicht erkannt.
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrl_TransGifButton_Create($hWndMain, $sFunc, $sPathGIF, $iX, $iY, $iW, $iH, $iStyle=-1)
    Local $STYLE = $WS_POPUP
    If $iStyle <> -1 Then $STYLE = BitOR($WS_POPUP,$iStyle)
    If Not WinExists($hWndMain) Then Return SetError(1,0,0)
    If Not FileExists($sPathGIF) Then Return SetError(2,0,0)
    Local $guiChildButton = GUICreate("", $iW, $iH, $iX, $iY, $STYLE, BitOR($WS_EX_LAYERED,$WS_EX_MDICHILD), $hWndMain)
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '__GUICtrl_TransGifButton_MDown', $guiChildButton)
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '__GUICtrl_TransGifButton_MUp', $guiChildButton)
    Local $aParam[4] = [$hWndMain,$guiChildButton,$sFunc,GUICtrlCreatePic($sPathGIF, 0, 0, $iW, $iH)]
    __GUICtrl_TransGifButton_Manage('add', $aParam)
    Return __GUICtrl_TransGifButton_Manage('create_sID', $guiChildButton)
    EndFunc ; ==>_GUICtrl_TransGifButton_Create

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

    ;===============================================================================
    ; Function Name....: _GUICtrl_TransGifButton_Show
    ; Description......: Macht alle erstellten GIF-Button sichtbar
    ; Parameter(s).....: keine
    ; Requirement(s)...: Ausführen vor oder nach @SW_SHOW der Haupt-GUI
    ; Return Value(s)..: kein
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrl_TransGifButton_Show()
    __GUICtrl_TransGifButton_Manage('show_All')
    EndFunc ; ==>_GUICtrl_TransGifButton_Show

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

    ;===============================================================================
    ; Function Name....: _GUICtrl_TransGifButton_GetMsg
    ; Description......: Gibt den String-Identifier des geklickten GIF-Button zurück
    ; Parameter(s).....: keine
    ; Requirement(s)...: keine
    ; Return Value(s)..: kein
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrl_TransGifButton_GetMsg()
    Return __GUICtrl_TransGifButton_Manage('get_Clicked')
    EndFunc ; ==>_GUICtrl_TransGifButton_GetMsg

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

    ;===============================================================================
    ; Function Name....: _GUICtrl_TransGifButton_SetImage
    ; Description......: Setzen eines neuen Images für einen GIF-Button
    ; Parameter(s).....: $sID String-Identifier von _GUICtrl_TransGifButton_Create
    ; $sPathImage Pfad zur GIF-Datei
    ; Requirement(s)...: keine
    ; Return Value(s)..: Erfolg 1
    ; Fehler 0 @error 1 - $sID existiert nicht
    ; 2 - GIF-Datei existiert nicht
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrl_TransGifButton_SetImage($sID, $sPathImage)
    Local $index = StringTrimLeft($sID, 11)
    Local $CtrlID = __GUICtrl_TransGifButton_Manage('get_sID', $index)
    If @error Then Return SetError(1,0,0)
    If Not FileExists($sPathImage) Then Return SetError(2,0,0)
    Return GUICtrlSetImage($CtrlID, $sPathImage)
    EndFunc ; ==>_GUICtrl_TransGifButton_SetImage

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

    #region - Interne Funktionen
    Func __GUICtrl_TransGifButton_Manage($sCommand, $vParam=0) ; max 255 Button ==> wenn mehr erwünscht >> $aGIFButton vergrößern
    Local Static $aGIFButton[256][3] = [[0]]
    Local Static $lastBtClicked = '', $BtClicked = ''
    Local $index
    Switch $sCommand
    Case 'add'
    $aGIFButton[0][1] = $vParam[0] ; hWndMain
    $aGIFButton[0][0] += 1
    $aGIFButton[$aGIFButton[0][0]][0] = $vParam[1] ; hWndChild
    $aGIFButton[$aGIFButton[0][0]][1] = $vParam[2] ; Funktionsname
    $aGIFButton[$aGIFButton[0][0]][2] = $vParam[3] ; Picture-ID
    Case 'get_Func'
    $index = _ArraySearch($aGIFButton, $vParam)
    If Not @error Then Return $aGIFButton[$index][1]
    Case 'create_sID'
    $index = _ArraySearch($aGIFButton, $vParam)
    If Not @error Then Return 'Gif_Button_' & $index
    Case 'show_All'
    For $i = 1 To $aGIFButton[0][0]
    GUISetState(@SW_SHOW, $aGIFButton[$i][0])
    Next
    Case 'set_Clicked'
    $index = _ArraySearch($aGIFButton, $vParam)
    $BtClicked = 'Gif_Button_' & $index
    Case 'get_Clicked'
    If $BtClicked <> $lastBtClicked Then
    $lastBtClicked = $BtClicked
    Return $BtClicked
    Else
    Return ''
    EndIf
    Case 'end_Func'
    $lastBtClicked = ''
    Case 'get_HWnd'
    Return $aGIFButton[$vParam][0]
    Case 'get_sID'
    Return $aGIFButton[$vParam][2]
    Case 'get_Main'
    Return $aGIFButton[0][1]
    EndSwitch
    EndFunc ; ==>__GUICtrl_TransGifButton_Manage

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

    Func __GUICtrl_TransGifButton_MDown()
    Local $hWnd = WinGetHandle('[ACTIVE]')
    Local $pos = WinGetPos($hWnd)
    WinMove($hWnd, '', $pos[0]+1, $pos[1]+1)
    EndFunc ; ==>__GUICtrl_TransGifButton_MDown

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

    Func __GUICtrl_TransGifButton_MUp()
    Local $hWnd = WinGetHandle('[ACTIVE]')
    WinActivate(__GUICtrl_TransGifButton_Manage('get_Main'))
    Local $pos = WinGetPos($hWnd)
    WinMove($hWnd, '', $pos[0]-1, $pos[1]-1)
    __GUICtrl_TransGifButton_Manage('set_Clicked', $hWnd)
    Call(__GUICtrl_TransGifButton_Manage('get_Func', $hWnd))
    __GUICtrl_TransGifButton_Manage('end_Func', $hWnd)
    EndFunc ; ==>__GUICtrl_TransGifButton_MUp
    #endregion

    [/autoit]