- 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
#Region - TimeStamp
; 2011-08-24 17:41:41
#EndRegion - TimeStamp
#include <GUIConstantsEx.au3>
#include 'TransGifButton.au3'
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"
For $i = 0 To 2
Local $hFileOut = FileOpen($aPictFile[$i], 2+8+16)
FileWrite($hFileOut, Binary($aBin[$i]))
FileClose($hFileOut)
Next
Func _DelBinaryTempFiles()
For $i = 0 To 2
FileDelete($aPictFile[$i])
Next
EndFunc
#endregion - Transparente Bild-Datei
$guiMain = GUICreate('Main', 400, 300, 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, '_exit', $guiMain)
GUISetBkColor(0xFFFFAA, $guiMain)
$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)
_GUICtrl_TransGifButton_Show()
GUISetState(@SW_SHOW, $guiMain)
$t = TimerInit()
While 1
Sleep(50)
If TimerDiff($t) >= 3000 Then
_GUICtrl_TransGifButton_SetImage($GifButton1, $aPictFile[2])
EndIf
WEnd
Func _exit()
Exit
EndFunc
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
TransGifButton.au3 v1.0
#Region - TimeStamp
; 2011-08-24 18:00:01 v 1.0
#EndRegion - TimeStamp
#include-once
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
#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
Func __GUICtrl_TransGifButton_MDown()
Local $hWnd = WinGetHandle('[ACTIVE]')
Local $pos = WinGetPos($hWnd)
WinMove($hWnd, '', $pos[0]+1, $pos[1]+1)
EndFunc ; ==>__GUICtrl_TransGifButton_MDown
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