#include <GUIConstantsEx.au3>

Opt('GUIOnEventMode', 1) ; den OnEventMode einschalten

Global $hGui = GUICreate('SternBewertung', 480, 160) ; Die GUI erstellen
GUISetOnEvent($GUI_EVENT_CLOSE, 'CloseGui') ; Funktion, die aufgerufen wird, wenn man das Fenster schließt
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, '_MOUSEMOVE') ; Funktion, die aufgerufen wird, sobald die Maus bewegt wird

GUICtrlCreateLabel('Bewertung:', 10, 25, 140, 32) ; Label mit Bewertungsschriftzug erstellen
GUICtrlSetFont(-1, 16, 400, 0, 'Verdana', 5) ; die Schriftgröße und -art ändern

Global $sIconPath = @ScriptDir & '\icons\' ; Variable zum Pfad der Icons
If Not FileExists($sIconPath) Then DirCreate($sIconPath) ; falls das Verzeichnis nicht existiert, dann dieses erstellen

Global $sIniFile = @ScriptDir & '\SternBewertung.ini' ; Pfad und Dateiname der Inidatei

Global $aidStars[5] ; Array für die IDs der Gui-Icons erstellen (hier für 5 Sterne)

Global $iShowStars = IniRead($sIniFile, 'Config', 'Bewertung', 0) ; Variable zum speichern der Bewertung (Wert aus der Inidatei lesen)
If $iShowStars < 0 Or $iShowStars > UBound($aidStars) - 1 Then $iShowStars = 0 ; wenn der gespeicherte Wert nicht im Wertebereich des Arrays liegt, dann auf 0 setzen

Global $iStars = -1 ; Variable zum speichern der temporären (MouseOver) Bewertung

; Die beiden folgenden Code-Zeilen erstellen die Icons, anhand der Binär-Daten, die mit Hilfe
; vom "'File to Base64 String' Code Generator" von UEZ in das Script integriert wurden.
If Not FileExists($sIconPath & 'star0.ico') Then _star0ico(True, $sIconPath) ; falls das Icon "star0.ico" nicht existiert, dieses erstellen
If Not FileExists($sIconPath & 'star1.ico') Then _star1ico(True, $sIconPath) ; falls das Icon "star1.ico" nicht existiert, dieses erstellen

For $i = 0 To UBound($aidStars) - 1 ; entsprechend der Größe des Arrays werden hier die Anzahl der Sterne erstellt
	$aidStars[$i] = GUICtrlCreateIcon($sIconPath & 'star0.ico', 0, 170 + $i * 36, 20, 32, 32) ; die Sternicons erstellen
	GUICtrlSetOnEvent(-1, '_SetStars') ; Funktion, die aufgerufen wird, wenn man das Sternicon anklickt
Next

_ChangeStars($iShowStars) ; einmal die Funktion "_ChangeStars" aufrufen, um die Anzahl der gespeicherten Sterne farbig anzuzeigen
GUISetState(@SW_SHOW, $hGui) ; die GUI anzeigen lassen

WinWaitClose($hGui) ; warten, bis die GUI geschlossen wird
Exit

Func CloseGui()
	GUIDelete($hGui) ; die GUI schließen
EndFunc   ;==>CloseGui

Func _SetStars()
	ToolTip('Das ist die' & @CRLF & 'gespeicherte Bewertung') ; Tooltip anzeigen
	$iShowStars = $iStars ; die "Speicher"-Variable mit der temporären Variable füllen
	IniWrite($sIniFile, 'Config', 'Bewertung', $iShowStars) ; den Wert in die Inidatei speichern
	_ChangeStars($iShowStars) ; die Sterne entsprechend setzen
EndFunc   ;==>_SetStars

Func _MOUSEMOVE()
	Local $aCursorInfo = GUIGetCursorInfo($hGui) ; Informationen über die GUI abrufen
	Switch $aCursorInfo[4] ; entsprechend dem GUI-Element, über dem sich gerade die Maus befindet, verzweigen
		Case $aidStars[0] To $aidStars[UBound($aidStars) - 1] ; wenn sich die Maus über einen der Sterne befindet, dann...
			$iStars = $aCursorInfo[4] - $aidStars[0] ; ausrechnen, um welchen Stern es sich handelt (Wert = 0-4)
			If $iStars <> $iShowStars Then ; wenn der Stern ungleich dem gespeicherten ist, dann...
				ToolTip('Bewertung ändern' & @CRLF & 'auf ' & $iStars + 1 & StringLeft(' Sterne', 6 + ($iStars > 0))) ; Tooltip anzeigen
			Else ; ansonsten (der Stern unter der Maus ist der gespeicherte Stern)...
				ToolTip('Das ist die' & @CRLF & 'gespeicherte Bewertung') ; Tooltip anzeigen
			EndIf
			_ChangeStars($iStars) ; temporäre Sterne anzeigen
		Case Else ; wenn sich die Maus nicht über einen der Sterne befindet, dann...
			ToolTip('') ; Tooltip schließen
			_ChangeStars($iShowStars) ; gespeicherte Sterne anzeigen
	EndSwitch
EndFunc   ;==>_MOUSEMOVE

Func _ChangeStars($iChange)
	For $i = 0 To UBound($aidStars) - 1 ; Schleife zum bearbeiten aller Sterne
		If $i > $iChange Then ; wenn der Wert größer als $iChange ist, dann..
			GUICtrlSetImage($aidStars[$i], $sIconPath & 'star0.ico', 0) ; den grauen Stern anzeigen
		Else ; ansonsten...
			GUICtrlSetImage($aidStars[$i], $sIconPath & 'star1.ico', 0) ; den farbigen Stern anzeigen
		EndIf
	Next
EndFunc   ;==>_ChangeStars





; Die folgenden Codezeilen wurden mit dem "'File to Base64 String' Code Generator v1.15 Build 2014-05-01" von UEZ erstellt
; Danke an UEZ (www.autoit.de) für diesen tollen Generator
Func _star0ico($bSaveBinary = False, $sSavePath = @ScriptDir)
	Local $star0ico
	$star0ico &= '9rRIAAABABAgIAFwIAAAqBAAABYAAMwAKAAYAJAAQAAYAVyhGQEeHh4BgAECgAECBIABB46OjlBYqFhYGoAFE4ABFoABqhmAARuAARyAAR+EAbYhjAGBCR2EE4EdF4ABAhSAARFsbGwhYKhgYBGABQWEMwGQPQGBDQ2FhYVZv79Av/+kpKT/gAWiUCoqKk6AC0+AAVRVgAFYgAFbgAFegAFgrYABYYQBwQJcwABZwAAKVcAAUcAATEZGRgBbiYmJoqioqAD/oqKi/0pKSvYYwTfAAAPFIMQfwQDBHwAMkpKSdc/PzwL/AQDT09P/o6MAo/+BgYGjJibuJsEUwQDBIVfEIsEbwQALwQPBHVLBKjo6OloAhoaGqKampv8I3d3dwhKenp7hDcAGDs0fzCADkJCQACKurq7/9vb2AP/m5ub/8vLyMP/Q0NDCL8AmhCl8KSnBVsExwQDBZcUCFwBEREQelZWVjoClpaX/2dnZwg6A7e3t/+jo6MEfDqfEHcpfEQChoaHJAcEN2tra/9jY2BD/5eXlwhLOzs4hwkOgoKByyQupqRSpBsAXfsEd1dXVAP/z8/P/4+PjAP/W1tb/5+fnoP/Jycn/wBRa5aONwAp4wR3BENLS0sJhA8EzwTHx8fH/zMxqzMEh0sBEacEK4Q7RPNHR4g5hJmEHYQbU1KLU4haqqqphFhI/DwMDAGALKra2tv/wPPDwYhjhCGEAYRvb2yDb/+rq6mIDysr8yv9hReEOYRPhJWEE5QW/4QHhBGEVvw4LAGAa0mEHGNzc3GIKaQDX19c/4kphHWEzYQThFO0E5OSg5P/f399haYc/DuMLAGEG4ODg4gvhDX8AAW8A7u7u/8DAwBr/YBk8Pw4LAKenp/Azvr6+4j1hP2E6fwADZwDhNPf39/+rq7yr/+FTPw4PAOBG4eFwj2EoYTl/AGcA4uLiYm/dYAi0Pw0TAGAXlmFg4TjHYTx/AGcA6enpYkJgCHZpPw1yDzzhkOFaYUDePN7efwBoAOEGYRetrTStlmAJHj8O6i4hr4ivr6XhJ+/v72Ip42FRaQDh4eFmAL0BMQDvsQexP7ETcAyWXwYPAHQPYA+wsLCWcScBAPlA+fn/+Pj4cgD7APv7//z8/P/9wP39//7+/joAMQHxsQH6+vo6AwEAMQgxBQPfBg8AsbGxluzs/uxyAzEFtQYPAA8ACQD1CG9xAAEAMSywBZAfBwcAs/izs5OxCg8ADwAPAA8AFw0AcTkwBo2fBwAAtfi1tY21cg8ADwAPAA8AbQ8A//JksAaBuQewXj//sQkPAA8ADwAPAA8ACwBxdBC3t7cqOQi6uroAjbi4uPa5ubnG/z8AMwC7u7vPBAwA+38DPgDqsAf6Dw8ADwABAH3wB3IxNQ8AAwBxWjACOT+fAw8ADwAPAA0AMBIPxQzFxY8HBAC8vLzPf18DDwAPAA8ADwADADBplv2fB/9yarAPv1YPAA8ADwAbDwA3GC1xXQ0AxsbG4P/CwsIMHwMPAA8Ahw8ADwAHAMHBwbr9B39wfv9NDwAPAA8ADwD/B1HvMZgFALF+cBktnwIPAA8ADw8ADwALAPA7A8TExPv2B/AIxl8CDwAPAA8ADwDDDwABAMPDw3XxXfE4/bAAXR8CDwAPAA8ADwAPAMcBALEm8a/IyMhxJ/+Vfw8ADwAPAA8ADwAGADAvCQDCwl2wKMIGADgA/wQAgAA0AAMAHAEBBgEW+AMggB/4AAABBj/84QgG/gAAfwEGARYBNgbwAEYAAw/gAAAHFsAANwA7AQEH/+AHgP//4A////AEA4T4HwQDP////AQDAP5//w=='
	$star0ico = _WinAPI_Base64Decode($star0ico)
	Local $tSource = DllStructCreate('byte[' & BinaryLen($star0ico) & ']')
	DllStructSetData($tSource, 1, $star0ico)
	Local $tDecompress
	_WinAPI_LZNTDecompress($tSource, $tDecompress, 4286)
	$tSource = 0
	Local $bString = Binary(DllStructGetData($tDecompress, 1))
	If $bSaveBinary Then
		Local $hFile = FileOpen($sSavePath & "\star0.ico", 18)
		FileWrite($hFile, $bString)
		FileClose($hFile)
	EndIf
	Return $bString
EndFunc   ;==>_star0ico

Func _star1ico($bSaveBinary = False, $sSavePath = @ScriptDir)
	Local $star1ico
	$star1ico &= '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'
	$star1ico &= 'sA0zBzEAsQAA1/v//0y84/99MAI5jwMPAA8ADwAOAJkA3Q8YqNr/2vpg/v/O+f8wGTMA0AHwCMv0+/8Bn9h+z08DDwAPAA8ADwA0MqLg2Jas5vXyDnEHMQAC2bAAhdXu/wCefta/Vg8ADwAPAA8ABAAGEJ/SLT5wNOH9/wz/1XAHMQDf+/7/ABSq3P8AqtUMPx8DDwAPAA8ADwAHAAOlANq6yPH5/9r8CP//3DAAsej2//gCpdr/TQ8ADwAPAA8AAQ0Ap9lRbM/r/wriMBDkMABDwOX/8Aaf3S2PAg8ADwAPAAMPAAwAqv8DCKrbAP/e+vz/1Pb74P8DptvGTwIPAA8ADw8ADwAPADMI2nWY4QDy/3/X7/8DqvzZXQ8CDwAPAA8ADwAPAAHzB9UMELDe/wz6rrBMqv+VDwAPAA8ADwADDwA5COMJAKpdsCjVBgA4AP8EAIAANAADABwBAQYBFvgDIIAf+AAAAQY//OEIBv4AAH8BBgEWATYG8ABGAAMP4AAABxbAADcAOwEBB//gB4D//+AP///wBAOE+B8EAz////wEAwD+f/8='
	$star1ico = _WinAPI_Base64Decode($star1ico)
	Local $tSource = DllStructCreate('byte[' & BinaryLen($star1ico) & ']')
	DllStructSetData($tSource, 1, $star1ico)
	Local $tDecompress
	_WinAPI_LZNTDecompress($tSource, $tDecompress, 4286)
	$tSource = 0
	Local $bString = Binary(DllStructGetData($tDecompress, 1))
	If $bSaveBinary Then
		Local $hFile = FileOpen($sSavePath & "\star1.ico", 18)
		FileWrite($hFile, $bString)
		FileClose($hFile)
	EndIf
	Return $bString
EndFunc   ;==>_star1ico

Func _WinAPI_Base64Decode($sB64String)
	Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
	If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
	Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
	$aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
	If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
	Return DllStructGetData($bBuffer, 1)
EndFunc   ;==>_WinAPI_Base64Decode

Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize)
	$tOutput = DllStructCreate("byte[" & $iBufferSize & "]")
	If @error Then Return SetError(1, 0, 0)
	Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0)
	If @error Then Return SetError(2, 0, 0)
	If $aRet[0] Then Return SetError(3, $aRet[0], 0)
	Return $aRet[6]
EndFunc   ;==>_WinAPI_LZNTDecompress
