#include-once
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <FontConstants.au3>


#region - "Button"-Funktionen
;==================================================================================================
; Funktion:			_DrawButton_Create($hGui, $text, $left ,$top ,$width ,$height)
; Beschreibung:		Zeichnet einen "Pseudo-Button"
; Rückgabewert:		Array-Variable mit Control-Daten
; Erfordernisse:	#include <FontConstants.au3>, <Winapi.au3>
;==================================================================================================
Func _DrawButton_Create($hGui, $text, $left ,$top ,$width ,$height=20)
	Enum $tRECT, $hDC, $hBrush, $hFont, $btnText, $hWnd, $size, $weight, $attrib, $font, $colT, $colB, $alignment
	Local $aBtn[13], $L = $left, $T = $top, $R = $L + $width, $B = $T + $height
	$aBtn[$btnText] = $text
	$aBtn[$hWnd] = $hGUI
	$aBtn[$tRECT] = DllStructCreate('int;int;int;int;')
	$aBtn[$size] = 14
	$aBtn[$weight] = 400
	$aBtn[$attrib] = 0
	$aBtn[$font] = "Arial"
	$aBtn[$colT] = 0x000000
	$aBtn[$colB] = 0x000000
	$aBtn[$alignment] = BitOR($DT_CENTER,$DT_VCENTER)
	DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($aBtn[$tRECT]), 'long', $L, 'long', $T, 'long', $R, 'long', $B)
	$aBtn[$hDC] = _WinAPI_GetDC($hGui)
	$aBtn[$hBrush] = _WinAPI_CreateSolidBrush(0x000000)
	$aBtn[$hFont] = _WinAPI_CreateFont(14, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
			 $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, "Arial")
	_WinAPI_SetTextColor($aBtn[$hDC], 0x000000)
	_WinAPI_SetBkColor($aBtn[$hDC], 0xFFFFFF)
	_WinAPI_SelectObject($aBtn[$hDC], $hFont)
	_WinAPI_SetBkMode($aBtn[$hDC], $TRANSPARENT)
	_DrawButton_AlignmentSet($aBtn)
	Return $aBtn
EndFunc  ;==>_DrawButton_Create

;==================================================================================================
; Funktion:			_DrawButton_SetStyle($aButton, $size, $weight, $attribute, $fontname, $colText, $colBorder)
; Beschreibung:		Setzt Textattribute und Farben des Button
; Bemerkung:		Für alle Parameter gilt:
;						Zum Setzen der Standardwerte "Default" übergeben
;						Um einen/mehrere Parameter NICHT zu verändern "-1" übergeben
;==================================================================================================
Func _DrawButton_SetStyle(ByRef $aButton, $size=14, $weight=400, $attribute=0, $fontname="Arial", $colText=0x000000, $colBorder=0x000000)
	Local $aAttrib[3] = [False,False,False] ; italic:2 underlined:4 strike:8
	; === mit "Default" alles auf Standard zurücksetzen
	If IsKeyword($size) Then
		$attribute = 14
	EndIf
	If IsKeyword($weight) Then
		$attribute = 400
	EndIf
	If IsKeyword($attribute) Then
		$attribute = 0
	EndIf
	If IsKeyword($fontname) Then
		$fontname = "Arial"
	EndIf
	If IsKeyword($colText) Then
		$colText = 0x000000
	EndIf
	If IsKeyword($colBorder) Then
		$colBorder = 0x000000
	EndIf
	; === bei "-1" keine Änderung
	If $size > -1 Then $aButton[6] = $size
	If $weight > -1 Then $aButton[7] = $weight
	If $attribute > -1 Then
		For $i = 1 To 3
			If BitAND($attribute, 2^$i) Then
				$aAttrib[$i-1] = True
			Else
				$aAttrib[$i-1] = False
			EndIf
		Next
		$aButton[8] = $attribute
	EndIf
	If $fontname > -1 Then $aButton[9] = $fontname
	If $colText > -1 Then $aButton[10] = $colText
	If $colBorder > -1 Then
		_WinAPI_DeleteObject($aButton[2])
		$aButton[2] = _WinAPI_CreateSolidBrush(__RGB2BGR($colBorder))
		$aButton[11] = $colBorder
	EndIf
	$aButton[3] = _WinAPI_CreateFont($aButton[6], 0, 0, 0, $aButton[7], $aAttrib[0], $aAttrib[1], $aAttrib[2], $DEFAULT_CHARSET, _
			 $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, $aButton[9])
	_WinAPI_SetTextColor($aButton[1], __RGB2BGR($aButton[10]))
	_WinAPI_SelectObject($aButton[1], $aButton[3])
	_WinAPI_SetBkMode($aButton[1], $TRANSPARENT)
	_WinAPI_RedrawWindow($aButton[5], $aButton[0])
	_DrawButton_Draw($aButton)
EndFunc  ;==>_DrawButton_SetStyle

;==================================================================================================
; Funktion:			_DrawButton_SetText($aButton, $sText)
; Beschreibung:		Setzt den Text des Button neu
;==================================================================================================
Func _DrawButton_SetText(ByRef $aButton, $sText)
	$aButton[4] = $sText
	_WinAPI_RedrawWindow($aButton[5], $aButton[0])
	_DrawButton_Draw($aButton)
EndFunc  ;==>_DrawButton_SetText

;==================================================================================================
; Funktion:			_DrawButton_AlignmentSet(ByRef $aButton, $Alignment)
; Beschreibung:		Setzt die Textausrichtung, Kombinationen mit BitOR()
;                   mgl. Werte: $DT_BOTTOM, $DT_CENTER, $DT_LEFT, $DT_RIGHT, $DT_TOP, $DT_VCENTER
;                   -1/Default = BitOR($DT_CENTER,$DT_VCENTER)
;==================================================================================================
Func _DrawButton_AlignmentSet(ByRef $aButton, $Alignment=-1)
	If IsKeyword($Alignment) Or $Alignment < 0 Then $Alignment = BitOR($DT_CENTER,$DT_VCENTER)
	$aButton[12] = $Alignment
	_WinAPI_RedrawWindow($aButton[5], $aButton[0])
	_DrawButton_Draw($aButton)
EndFunc  ;==>_DrawButton_AlignmentSet

;==================================================================================================
; Funktion:			_DrawButton_AlignmentGet($aButton, $bRetAsStr)
; Beschreibung:		Gibt die Textausrichtung zurück, False(Standard) = numerisch, True = als String
; Idee: 			@progandy
;==================================================================================================
Func _DrawButton_AlignmentGet($aButton, $bRetAsStr=False)
	Local $sAlignment = ''
	Select
		Case BitAND($aButton[12], $DT_BOTTOM) = $DT_BOTTOM
			$sAlignment &= '$DT_BOTTOM '
		Case BitAND($aButton[12], $DT_VCENTER) = $DT_VCENTER
			$sAlignment &= '$DT_VCENTER '
		Case Else
			$sAlignment &= '$DT_TOP '
	EndSelect
	Select
		Case BitAND($aButton[12], $DT_CENTER) = $DT_CENTER
			$sAlignment &= '$DT_CENTER '
		Case BitAND($aButton[12], $DT_RIGHT) = $DT_RIGHT
			$sAlignment &= '$DT_RIGHT '
		Case Else
			$sAlignment &= '$DT_LEFT '
	EndSelect
	If $bRetAsStr Then Return StringTrimRight($sAlignment, 1)
	Return $aButton[12]
EndFunc  ;==>_DrawButton_AlignmentGet

;==================================================================================================
; Funktion:			_DrawButton_Draw($aButton)
; Beschreibung:		Zeichnet den Button
; Bemerkung:		Um den Button sichtbar zu machen muß die Funktion aufgerufen werden:
;					- erstmalig nach GUISetState()
;					- nach jeder Fensterbewegung (GUIRegisterMsg($WM_MOVE) erforderlich)
;					- nach den Events: $GUI_EVENT_RESTORE, $GUI_EVENT_MAXIMIZE
;==================================================================================================
Func _DrawButton_Draw($aButton)
	_WinAPI_FrameRect($aButton[1], DllStructGetPtr($aButton[0]), $aButton[2])
	_WinAPI_DrawText($aButton[1], $aButton[4], $aButton[0], BitOR($DT_NOCLIP,$DT_SINGLELINE,$aButton[12]))
EndFunc  ;==>_DrawButton_Draw

;==================================================================================================
; Funktion:			_DrawButton_Release($aButton)
; Beschreibung:		Ressourcen freigeben am Programmende
;==================================================================================================
Func _DrawButton_Release($aButton)
	_WinAPI_DeleteObject($aButton[2])
	_WinAPI_ReleaseDC($aButton[5], $aButton[1])
	_WinAPI_DeleteObject($aButton[3])
	_WinAPI_ReleaseDC(0, $aButton[1])
	_WinAPI_InvalidateRect(0, 0)
EndFunc  ;==>_DrawButton_Release

;==================================================================================================
; Funktion:			_DrawButton_Clicked($aButton)
; Beschreibung:		Überprüft ob Mausklick auf den Button erfolgte
; Rückgabewert:		True  - Klick auf Buttonfläche
;                   False - Klick außerhalb
; Bemerkung:		Die Funktion muß einem Maus-Ereignis zugeordnet werden (z.B. $GUI_EVENT_PRIMARYDOWN)
;==================================================================================================
Func _DrawButton_Clicked($aButton)
	Local $iBar = _WinAPI_GetSystemMetrics(4)
	Local $iBorderH = _WinAPI_GetSystemMetrics(6)
	Local $iBorderB = _WinAPI_GetSystemMetrics(32)
	Local $old = Opt('MouseCoordMode', 0)
	Local $mPos = MouseGetPos()
	Opt('MouseCoordMode', $old)
	$mPos[0] -= $iBorderB/2
	$mPos[1] -= $iBar + 2*$iBorderH
	Local $ret = DllCall("user32.dll", "bool", "PtInRect", "ptr", DllStructGetPtr($aButton[0]), "long", $mPos[0], "long", $mPos[1])
	If $ret[0] > 0 Then Return True
	Return False
EndFunc  ;==>_DrawButton_Clicked
#endregion

Func __RGB2BGR($iColor)
	Local $sH = Hex($iColor,6)
    Return '0x' & StringRight($sH, 2) & StringMid($sH,3,2) & StringLeft($sH, 2)
EndFunc  ;==>__RGB2BGR
