Als ich mich etwas mit GDI+ auseinander gesetzt habe, ist mir aufgefallen das Farbverläufe jedesmal manuell mit _GDIPlus_GraphicsDrawLine umgesetzt waren. Anbei eine andere Möglichkeit, vielleicht kann es ja mal jemand gebrauchen.
Funktion:
Spoiler anzeigen
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit]_Main()
[/autoit] [autoit][/autoit] [autoit]Func _Main()
Local $hGUI, $hWnd, $hGraphic, $hBrush
; Erstellt eine GUI
$hGUI = GUICreate("GDI+", 400, 300)
$hWnd = WinGetHandle("GDI+")
GUISetState()
; Zeichnet und füllt ein Rechteck
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBrush = _GDIPlus_BrushCreateLinear(0, 0, 200, 0)
_GDIPlus_GraphicsFillRect($hGraphic, 0, 0, 200, 50, $hBrush)
_GDIPlus_GraphicsFillRect($hGraphic, 0, 70, 400, 50, $hBrush)
_GDIPlus_BrushDispose($hBrush)
$hBrush = _GDIPlus_BrushCreateLinear(0, 140, 0, 190, 0xFF00FF00, 0xFFFF0000)
_GDIPlus_GraphicsFillRect($hGraphic, 0, 140, 200, 50, $hBrush)
; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
; Ressourcen freigeben
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
EndFunc ;==>_Main
[/autoit] [autoit][/autoit] [autoit]Func _GDIPlus_BrushCreateLinear($iX1, $iY1, $iX2, $iY2, $iARGB1 = 0xFF000000, $iARGB2 = 0xFFFFFFFF)
Local $aResult, $start, $end, $sPoint, $ePoint
$start = DllStructCreate("int X;int Y")
DllStructSetData($start,"X",$iX1)
DllStructSetData($start,"Y",$iY1)
$sPoint = DllStructGetPtr($start)
$end = DllStructCreate("int X;int Y")
DllStructSetData($end,"X",$iX2)
DllStructSetData($end,"Y",$iY2)
$ePoint = DllStructGetPtr($end)
$aResult = DllCall($ghGDIPDll, "int", "GdipCreateLineBrushI", "ptr", $sPoint, "ptr", $ePoint, "int", $iARGB1, "int", $iARGB2, "int", 0, "int*", 0)
If @error Then Return SetError(@error, @extended, 0)
Return SetError(0, $aResult[0], $aResult[6])
EndFunc ;==>_GDIPlus_BrushCreateLinear
Erklärung:
Spoiler anzeigen
_GDIPlus_BrushCreateLinear
--------------------------------------------------------------------------------
Erstellt ein Pinselobjekt mit linearen Farbverlauf
#Include <GDIPlus.au3>
_GDIPlus_BrushCreateLinear($iX1, $iY1, $iX2, $iY2[, $iARGB1 = 0xFF000000[, $iARGB2 = 0xFFFFFFFF]])
Parameter:
$iX1 Die X-Koordinate des Startpunktes der Linie
$iY1 Die Y-Koordinate des Startpunktes der Linie
$iX2 Die X-Koordinate des Endpunktes der Linie
$iY2 Die Y-Koordinate des Endpunktes der Linie
$iARGB1 Die Farbe des Startpunktes der Linie
$iARGB2 Die Farbe des Endpunktes der Linie
Rückgabewert:
Erfolg: Handle zu einem Pinselobjekt mit linearen Farbverlauf
Fehler: False
Bemerkung:
Wenn man mit dem Pinselobjekt fertig ist, ist _GDIPlus_BrushDispose aufzurufen, um die Ressourcen wieder freizugeben
Alles anzeigen
Falls es die Funktion schon geben sollte, dann hab ich dies wohl übersehen
edit: verbessert, danke UEZ, war nur zum Testen