﻿#include-once
#include <AutoItConstants.au3>
#include <GDIPlus.au3>
#include <Memory.au3>
#include <MemoryConstants.au3>
#include <SendMessage.au3>
#include <StructureConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIRes.au3>
#include <WinAPISysInternals.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

Global Const $__g_sGuiCtrlStars_Version = '1.1.0.0'
Global Const $__g_sGuiCtrlStars_Date = '2018/07/24 13:00:00'
Global Const $tagGUICONTROLSTARSINFO = 'struct;ptr prevwndproc;handle dllcallback;handle cursor;uint stars;endstruct'

_GDIPlus_Startup()
; The Star-Image (PNG-File), at the end of this script, is converted as Base64-String.
; This Image has been developed by "paomedia" (http://paomedia.github.io/small-n-flat/) under the "CC0 1.0 Universell"-license.
Global $__g_hGuiCtrlStars_StarRaw = _GDIPlus_BitmapCreateFromMemory(_GuiCtrlStars_StarPng()) ; 256x256 Pixel PNG (will be resized)
OnAutoItExitRegister('_GuiCtrlStars_Exit')

; Hinweis!
; Die Beschreibungen der Funktionen sind auf deutsch, weil mein englisch dafuer zu schlecht ist!

Func _GuiCtrlStars_Exit()
	_GDIPlus_BitmapDispose($__g_hGuiCtrlStars_StarRaw)
	_GDIPlus_Shutdown()
EndFunc

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlStars_Create
; Description ...: Mit dieser Funktion wird das Control-Element (Pic) erstellt und die neue Window-Proc registriert
; Syntax ........: _GuiCtrlStars_Create($iLeft, $iTop[, $iHeight = 32[, $iStars = 0]])
; Parameters ....: $iLeft               - Die Position, an der die Sterne erstellt werden sollen (Links)
;                  $iTop                - Die Position, an der die Sterne erstellt werden sollen (Oben)
;                  $iHeight             - [optional] Die Hoehe (auf diesen Wert werden die Sterne skaliert) Default ist 32.
;                  $iStars              - [optional] Die Anzahl der Sterne, die beim Erstellen aktiv sein sollen. Default ist 0.
; Return values .: Im Erfolgsfall wird die Control-ID des Pic-Controls zurueckgegeben (wird zum Aufruf der anderen Funktionen benoetigt),
;                  ansonsten ist @error =
;                                         1, wenn das Pic-Control nicht erstellt werden konnte
;                                         2, wenn der Speicher nicht reserviert werden konnte
; Author ........: Oscar (www.autoit.de)
; ===============================================================================================================================
Func _GuiCtrlStars_Create($iLeft, $iTop, $iHeight = 32, $iStars = 0)
	Local Const $iSpace = 5
	Local $iWidth, $idCtrl, $hCtrl, $pMem, $tGuiCtrlStarsInfo, $hWndProc, $pWndProc, $pPrevWndProc
	If $iStars < 0 Then $iStars = 0
	If $iStars > 5 Then $iStars = 5
	$iWidth = 5 * $iHeight + 4 * $iSpace ; Calculate control-width (5 stars and 4 spaces)
	$idCtrl = GUICtrlCreateLabel('', $iLeft, $iTop, $iWidth, $iHeight)
	If $idCtrl = 0 Then Return SetError(1, 0, False)
	$hCtrl = GUICtrlGetHandle($idCtrl)
	$pMem = _MemGlobalAlloc(16, $GPTR) ; Allocate memory for the struct (16 Bytes)
	If $pMem = 0 Then Return SetError(2, 0, False)
	$tGuiCtrlStarsInfo = DllStructCreate($tagGUICONTROLSTARSINFO, $pMem)
	$hWndProc = DllCallbackRegister('_GuiCtrlStars_Proc', 'ptr', 'hwnd;uint;wparam;lparam') ; Register the new WindowProc
	$pWndProc = DllCallbackGetPtr($hWndProc) ; Pointer to the new WindowProc
	$pPrevWndProc = _WinAPI_SetWindowLong($hCtrl, $GWL_WNDPROC, $pWndProc) ; Returns the pointer to previous WindowProc
	; Copy to the struct
	$tGuiCtrlStarsInfo.prevwndproc = $pPrevWndProc
	$tGuiCtrlStarsInfo.dllcallback = $hWndProc
	$tGuiCtrlStarsInfo.cursor = _WinAPI_LoadCursor(0, $IDC_HAND)
	$tGuiCtrlStarsInfo.stars = $iStars
	_WinAPI_SetWindowLong($hCtrl, $GWL_USERDATA, $pMem) ; Set the Struct-Pointer to the UserData
	GUICtrlSetData($idCtrl, $iStars)
	Return $idCtrl
EndFunc   ;==>_GuiCtrlStars_Create

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlStars_Proc
; Description ...: Die neue WindowProc, die dem Stars-Control bei "_GuiCtrlStars_Create" zugewiesen wird.
; Syntax ........: _GuiCtrlStars_Proc($hWnd, $iMsg, $wParam, $lParam)
; Return values .: None
; Author ........: Oscar (www.autoit.de)
; ===============================================================================================================================
Func _GuiCtrlStars_Proc($hWnd, $iMsg, $wParam, $lParam)
	Local $pMem, $tGuiCtrlStarsInfo, $tParam, $tPS, $pPS, $iWidth, $iHitTest
	$pMem = _WinAPI_GetWindowLong($hWnd, $GWL_USERDATA)
	$tGuiCtrlStarsInfo = DllStructCreate($tagGUICONTROLSTARSINFO, $pMem)
	Switch $iMsg
		Case $WM_DESTROY ; When deletes the Control (GUICtrlDelete)
			_WinAPI_SetWindowLong($hWnd, $GWL_WNDPROC, $tGuiCtrlStarsInfo.prevwndproc)
			DllCallbackFree($tGuiCtrlStarsInfo.dllcallback)
			_WinAPI_DestroyCursor($tGuiCtrlStarsInfo.cursor)
			$tGuiCtrlStarsInfo = 0
			_MemGlobalFree($pMem)
			Return 0
		Case $WM_SETTEXT ; When change data (GuiCtrlSetData)
			$tParam = DllStructCreate('char stars[2]', $lParam) ; $lParam is a null-terminated string
			$tGuiCtrlStarsInfo.stars = $tParam.stars ; save the new parameter
			_SendMessage($hWnd, $WM_PAINT) ; Redraw the control
			Return True
		Case $WM_GETTEXTLENGTH ; When read data (GuiCtrlRead)
			Return 1 ; The return value is the length of the text in characters, not including the terminating null character
		Case $WM_GETTEXT ; When read data (GuiCtrlRead)
			$tParam = DllStructCreate('char stars[' & $wParam & ']', $lParam) ; $lParam is a pointer ($wParam the size)
			$tParam.stars = String($tGuiCtrlStarsInfo.stars) & Chr(0) ; copy data in struct
			Return 1 ; The return value is the number of characters copied, not including the terminating null character.
		Case $WM_RBUTTONUP ; When click on the right mousebutton
			$tGuiCtrlStarsInfo.stars = 0 ; set to "no stars"
			_SendMessage($hWnd, $WM_PAINT) ; Redraw the control
		Case $WM_LBUTTONUP ; When click on the left mousebutton
			$iWidth = _WinAPI_GetWindowWidth($hWnd) ; The width of the control
			$tGuiCtrlStarsInfo.stars = Int(5 / $iWidth * BitAND($lParam, 0x0000ffff)) + 1 ; The low-order word ($lParam) specifies the x-coordinate of the cursor
			_SendMessage($hWnd, $WM_PAINT) ; Redraw the control
		Case $WM_PAINT ; When redraw the control
			$tPS = DllStructCreate($tagPAINTSTRUCT)
			$pPS = DllStructGetPtr($tPS)
			_WinAPI_BeginPaint($hWnd, $pPS)
			_GuiCtrlStars_SetGraphic($hWnd, $tGuiCtrlStarsInfo.stars)
			_WinAPI_EndPaint($hWnd, $pPS)
			Return 0
		Case $WM_SETCURSOR
			$iHitTest = BitAND($lParam, 0x0000ffff)
			If $iHitTest = 1 Then ; At the Clientarea
				_WinAPI_SetCursor($tGuiCtrlStarsInfo.cursor) ; Set the "HAND"-Cursor
				Return False
			EndIf
	EndSwitch
	Return DllCall('user32.dll', 'lresult', 'CallWindowProc', 'ptr', $tGuiCtrlStarsInfo.prevwndproc, 'hwnd', $hWnd, 'uint', $iMsg, 'wparam', $wParam, 'lparam', $lParam)[0]
	; Bug in _WinAPI_CallWindowProc (https://autoit.de/index.php?thread/86028-mehrere-udfs-mit-windowproc-verketten/&postID=690695#post690695)
EndFunc   ;==>_GuiCtrlStars_Proc

; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlStars_SetGraphic
; Description ...: Hier wird die Grafik erstellt und in das Control-Element gezeichnet
; Syntax ........: _GuiCtrlStars_SetGraphic($hCtrl[, $iStars = 0])
; Parameters ....: $hCtrl               - Das Handle vom Control-Element
;                  $iStars              - [optional] Die Anzahl der aktiven Sterne. Default ist 0.
; Return values .: None
; Author ........: Oscar (www.autoit.de)
; ===============================================================================================================================
Func _GuiCtrlStars_SetGraphic($hCtrl, $iStars = 0)
	Local Const $iSpace = 5
	Local $tCtrlRect, $iW, $iH, $hParent, $hBitmap, $hGfxCtx, $hDC, $iBkColor, $hGraphic
	Local $hStarBlank, $hStarShine, $hBlankEffect, $hShineEffect
	$tCtrlRect = _WinAPI_GetWindowRect($hCtrl)
	$iW = $tCtrlRect.Right - $tCtrlRect.Left
	$iH = $tCtrlRect.Bottom - $tCtrlRect.Top
	$hParent = _WinAPI_GetParent($hCtrl)
	$hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
	$hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
	_GDIPlus_GraphicsSetInterpolationMode($hGfxCtx, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
	_GDIPlus_GraphicsSetSmoothingMode($hGfxCtx, 2)
	$hDC = _WinAPI_GetDC($hParent)
	$iBkColor = _WinAPI_GetBkColor($hDC)
	_WinAPI_ReleaseDC($hParent, $hDC)
	_GDIPlus_GraphicsClear($hGfxCtx, 0xFF000000 + $iBkColor)
	$hStarBlank = _GDIPlus_ImageResize($__g_hGuiCtrlStars_StarRaw, $iH, $iH)
	$hBlankEffect = _GDIPlus_EffectCreateHueSaturationLightness(0, -100, 40)
	_GDIPlus_BitmapApplyEffect($hStarBlank, $hBlankEffect)
	$hStarShine = _GDIPlus_ImageResize($__g_hGuiCtrlStars_StarRaw, $iH, $iH)
	$hShineEffect = _GDIPlus_EffectCreateHueSaturationLightness(0, 100, 10)
	_GDIPlus_BitmapApplyEffect($hStarShine, $hShineEffect)
	For $i = 0 To 4
		_GDIPlus_GraphicsDrawImage($hGfxCtx, $iStars >= $i + 1 ? $hStarShine : $hStarBlank, $i * ($iH + $iSpace), 0)
	Next
	$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hCtrl)
	_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
	; Ressourcen freigeben
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_EffectDispose($hBlankEffect)
	_GDIPlus_EffectDispose($hShineEffect)
	_GDIPlus_GraphicsDispose($hGfxCtx)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_BitmapDispose($hStarBlank)
	_GDIPlus_BitmapDispose($hStarShine)
EndFunc   ;==>_GuiCtrlStars_SetGraphic

; Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19
; The Star-Image (PNG-File) are converted as Base64-String.
; These Image has been developed by "paomedia" (http://paomedia.github.io/small-n-flat/) under the "CC0 1.0 Universell"-license.
Func _GuiCtrlStars_StarPng($bSaveBinary = False, $sSavePath = @ScriptDir)
	Local $star
	$star &= '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'
	$star &= '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'
	$star &= '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'
	$star &= '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'
	$star &= 'VJhlEMRTAPMCIP/UV5Z8wh68l4T2VPi7cE39Afbj6As7AcwNgPxSX1nyCQvxXhLOT4VZBkH8BDAvAFqc+sqST+iFz5LQkgqzC4I4CmA2AFqc+sqSTxjMwiXh/FSYXRDETwDTAZA99ZUlnxCFhUvCvakwuyCInwC+1W6oferg9sHPT31lySdEB0RwDKZl75JwNhVmFwSxEsBMALQ39ZUln5AU25JwOhXuVHfryuk1NkEQLwE81Z5W16tHjdRXlnxCVvYsCadS4a7pTq6cWmMTBHETwD+Adz82SX3BtttLPjCuLPmE7MwsCcepsFpSD618bI1NEMRLAOfaZ5tR8/bm5aWLYNr7wQAPwvDLkk9AY3tJqNQDMEmnmpebRr3UfBeuSTZBEBsBjL56qFXL3YXmF0tn1bK6c+XDa7LkE8gw+mZ7TO1XDzc/W/od1XSHVv5snUUQxEkA72peVbfBEytLPoEko2+0+9Ub1D3wKvXrKx9a/0/s4/Hh16iF3MwK7Y/RAAAAAElFTkSuQmCC'
	Local $bString = _WinAPI_Base64Decode($star)
	If @error Then Return SetError(1, 0, 0)
	$bString = Binary($bString)
	If $bSaveBinary Then
		Local Const $hFile = FileOpen($sSavePath & "\star.png", 18)
		If @error Then Return SetError(2, 0, $bString)
		FileWrite($hFile, $bString)
		FileClose($hFile)
	EndIf
	Return $bString
EndFunc   ;==>_GuiCtrlStars_StarPng

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
