#include-once
#include <GDIPlus.au3>
#include <WinAPI.au3>

;===============================================================================
; Description:		: Funktion zum laden von Grafikdateien (alle die GDI+ unterstützt) in ein Pic-Control
;                     Dabei werden die Grafikdateien proportional in das Pic-Control eingepasst (skaliert)
; Parameter(s):		: $idPic = ID des Pic-Control
;                     $sImgFile = der Pfad und Dateiname der Grafikdatei oder die Grafikdatei als Binärdaten
;                     $fUpscale = falls TRUE, dann werden Grafikdateien, die kleiner als das Control sind hochscaliert
;                     $iBkColor = Hintergrundfarbe (Format: ARGB) für das Pic-Controls
;                     $fDebugInfo = falls TRUE, werden ein paar Debugdaten in der Console angezeigt
; Requirement:		: #include <GDIPlus.au3>, #include <WinAPI.au3>
; Return Value(s):	: Im Erfolgsfall wird TRUE zurückgegeben (@error = 0). Ansonsten:
;                     @error = 1 wenn das Pic-Control nicht existiert
;                     @error = 2 wenn die Abmessungen des Pic-Control nicht gelesen werden konnten
;                     @error = 3 wenn die Grafikdatei nicht geladen werden konnte
; Author(s):		: Oscar (www.autoit.de)
;===============================================================================
Func _GuiCtrlSetImageEx($idPic = Default, $sImgFile = '', $fUpscale = False, $iBkColor = 0xFF000000, $fDebugInfo = False)
	Local $hPic, $aCtrlSize, $hGfx, $hImage, $hBitmap, $hGfxCtxt, $iImgWidth, $iImgHeight, $hBitmapScaled, $hBMP
	Local $iScalefactor = 1, $iFactorW, $iFactorH, $iScaleWidth, $iScaleHeight, $iError = 0
	Local Const $IMAGE_BITMAP = 0x0000
	Local Const $STM_SETIMAGE = 0x0172
	If $idPic = Default Or $idPic <= 0 Then $idPic = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($idPic))
	$hPic = GUICtrlGetHandle($idPic) ; das Handle vom Pic-Control holen
	If Not IsHWnd($hPic) Then Return SetError(1, 0, 0) ; wenn kein Handle, dann Funktion mit Fehlermeldung verlassen
	$aCtrlSize = WinGetClientSize($hPic) ; die Abmessungen (width & height) des Pic-Control holen
	If @error Then Return SetError(2, 0, 0) ; im Fehlerfall die Funktion mit Fehlermeldung verlassen
	_GDIPlus_Startup() ; GDI-Plus starten
	$hGfx = _GDIPlus_GraphicsCreateFromHWND($hPic) ; Ein Graphic-Objekt vom Pic-Control erstellen
	$hBitmap = _GDIPlus_BitmapCreateFromGraphics($aCtrlSize[0], $aCtrlSize[1], $hGfx) ; Eine Bitmap der Graphic erstellen
	$hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Graphic-Context der Bitmap holen
	_GDIPlus_GraphicsClear($hGfxCtxt, $iBkColor) ; Die Bitmap mit der Hintergrundfarbe füllen
	If IsBinary($sImgFile) Then ; wenn die Grafikdatei als Binärdaten übergeben wurde, dann...
		$hImage = _GDIPlus_BitmapCreateFromMemory($sImgFile) ; die Grafikdatei aus den Binärdaten laden
		If @error Then $iError = 3 ; wenn das laden der Binärdaten fehlgeschlagen ist, dann Errorcode speichern
	Else ; sonst (Grafikdatei befindet sich auf Datenträger)...
		$hImage = _GDIPlus_BitmapCreateFromFile($sImgFile) ; die Grafikdatei laden
		If @error Then $iError = 3 ; wenn das laden der Datei fehlgeschlagen ist, dann Errorcode speichern
	EndIf
	If Not $iError Then ; wenn kein Fehler aufgetreten ist, dann...
		$iImgWidth = _GDIPlus_ImageGetWidth($hImage) ; die Breite der Grafikdatei holen
		$iImgHeight = _GDIPlus_ImageGetHeight($hImage) ; die Höhe der Grafikdatei holen
		; wenn die Größe des Pic-Controls kleiner als die Grafikdatei ist oder $fUpscale = True, dann muss die Grafikdatei skaliert werden (Scalefactor berechnen):
		If ($aCtrlSize[0] < $iImgWidth Or $aCtrlSize[1] < $iImgHeight) Or ($fUpscale = True) Then
			$iFactorW = $aCtrlSize[0] / $iImgWidth
			$iFactorH = $aCtrlSize[1] / $iImgHeight
			If $iFactorW > $iFactorH Then
				$iScalefactor = $iFactorH
			Else
				$iScalefactor = $iFactorW
			EndIf
		EndIf
		$iScaleWidth = Int($iImgWidth * $iScalefactor) ; die Breite der skalierten Grafikdatei berechnen
		$iScaleHeight = Int($iImgHeight * $iScalefactor) ; die Höhe der skalierten Grafikdatei berechnen
		If $fDebugInfo Then ; Debuginformationen ausgeben, wenn gewünscht:
			ConsoleWrite(StringFormat('Ctrl-Size: %i x %i\n', $aCtrlSize[0], $aCtrlSize[1]))
			ConsoleWrite(StringFormat('Img-Size: %i x %i\n', $iImgWidth, $iImgHeight))
			ConsoleWrite(StringFormat('Scale-Factor: %f\n', $iScalefactor))
			ConsoleWrite(StringFormat('Scale-Size: %i x %i\n\n', $iScaleWidth, $iScaleHeight))
		EndIf
		$hBitmapScaled = _GDIPlus_ImageResize($hImage, $iScaleWidth, $iScaleHeight) ; die Grafikdatei skalieren
		; und zentriert in die Bitmap zeichnen:
		_GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hBitmapScaled, ($aCtrlSize[0] - $iScaleWidth) / 2, ($aCtrlSize[1] - $iScaleHeight) / 2, $iScaleWidth, $iScaleHeight)
	EndIf
	$hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) ; HBitmap von der Bitmap erstellen
	_WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)) ; und an das Pic-Control senden
	; zum Schluss noch aufräumen...
	_WinAPI_DeleteObject($hBMP)
	_GDIPlus_BitmapDispose($hBitmapScaled)
	_GDIPlus_GraphicsDispose($hGfxCtxt)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_GraphicsDispose($hGfx)
	_GDIPlus_BitmapDispose($hImage)
	_GDIPlus_Shutdown()
	Return SetError($iError, 0, $iError = 0)
EndFunc   ;==>_GuiCtrlSetImageEx
