#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 ( bugfix@autoit.de )
;===============================================================================
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 ( bugfix@autoit.de )
;===============================================================================
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 ( bugfix@autoit.de )
;===============================================================================
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 ( bugfix@autoit.de )
;===============================================================================
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
