Hallo,
Ich suche eine GDI+ Funktion mit der man ein Dreick(unten links, oben rechts, unten rechts) wie zB das vom VLC-Player füllen kann.
Ich hab schon einiges versucht aber die bzw. meine Rechnungen sind immer falsch oder der "Farbverlauf" ist nur eine Farbe.
Dreieck mit GDI+ Farbverlauf füllen
-
- [ gelöst ]
-
Higggiii -
14. August 2010 um 18:23 -
Geschlossen -
Erledigt
-
-
Ich hatte, um verschiedene Farbpaletten zu erstellen, etwas ähnliches geschrieben. Die Stützfarben werden angegeben, die Zwischenfarben in beliebiger Schrittweite ausgerechnet
Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <Color.au3>
Opt("GUIOnEventMode", 1)
;Palette für den Farbverlauf RRGGBB
;
;
$rot=0xFF0000
$gelb=0xFFFF00
$schwarz=0x000000
$weiss=0xFFFFFF
$blau=0x0000FF$random=random(0,255^3,1);zufallsfarbe erzeugen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];die Grundfarben werden in ein array eingetragen, die funktion berechnet dann alle zwischenfarben
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Dim $Farbverlauf_1[2]=[0xFF0000,0x00FF00];Rot+Grün
Dim $Farbverlauf_2[2]=[$random,0xFFFFFF];Blau +Weiß
Dim $Farbverlauf_3[6]=[$schwarz,$rot,$gelb,$weiss,$blau,$schwarz];
;-----------------------------------------------
$hGUI = GUICreate("Farbverlauf", 1024, 500, 557, 78)
GUISetOnEvent(-3, "death")
GUISetState(@SW_SHOW);-----------------------------------------------
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$bin="0x"Draw() ;farbverläufe zeichnen
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Sleep(20)
tooltip("Farbcode: "&hex(pixelgetcolor(mousegetpos(0),mousegetpos(1),$hgui)))
WEndfunc draw() ;zeichnet 3 Farbverläufe in die GUI
[/autoit] [autoit][/autoit] [autoit]
for $i=0 to 800
$col = _createcolorfrompalette($farbverlauf_1, $i, 800) ;ermittelt die Farbe zwischen den arrayinhalten
$pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
_GDIPlus_Graphicsdrawline($hGraphic, $i, 50, $i,150 , $pen) ;füllt ein rechteck mit dieser Farbe aus
_GDIPlus_PenDispose($pen) ;löscht den pen
next
;3. Farbverlauf 100 Pixel breit von rechts nach links halbtransparent
for $i=0 to 500
$col = _createcolorfrompalette($farbverlauf_3, $i, 500) ;ermittelt die Farbe zwischen den arrayinhalten
$pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
_GDIPlus_Graphicsdrawline($hGraphic, $i, 200, $i,300 , $pen) ;füllt ein rechteck mit dieser Farbe aus
_GDIPlus_PenDispose($pen) ;löscht den pen
next
for $i=0 to 200
$col = _createcolorfrompalette($farbverlauf_2, $i, 200) ;ermittelt die Farbe zwischen den arrayinhalten
;$bin&="00"&stringright(hex($col,6),2)&stringmid(hex($col,6),3,2)&stringleft(hex($col,6),2)
$pen = _GDIPlus_PenCreate($col+0xFF000000) ;übergibt diese Farbe einem brush
_GDIPlus_Graphicsdrawline($hGraphic, $i, 350, $i,450 , $pen) ;füllt ein rechteck mit dieser Farbe aus
_GDIPlus_PenDispose($pen) ;löscht den pen
nextendfunc
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func death()
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>deathFunc _createcolorfrompalette(ByRef $aPalette, $count, $maximum) ;gibt zwischenfarbe anhand der beiden Nachbarn im Palette-array zurück
[/autoit] [autoit][/autoit] [autoit]
Local $ubound = UBound($aPalette) - 1 ;maximale Anzahl Palettenfarben
Local $percent = $count * $ubound / $maximum ;Position innerhalb des Palettenarrays
$index = Int($percent) ;index des Palettenarrays "unterhalb" von percent
If $percent = $index Then Return $aPalette[$index] ;bei genauem indextreffer farbe zurückgeben$startrot = _ColorGetRed($aPalette[$index]) ;startfarbe
[/autoit] [autoit][/autoit] [autoit]
$startgruen = _ColorGetGreen($aPalette[$index])
$startblau = _ColorGetBlue($aPalette[$index])
$endrot = _ColorGetRed($aPalette[$index + 1]) ;endfarbe
$endgruen = _ColorGetGreen($aPalette[$index + 1])
$endblau = _ColorGetBlue($aPalette[$index + 1])$xx = (($percent - $index)) ;faktor zwischen 0 und 1
[/autoit] [autoit][/autoit] [autoit]$r = Int($startrot - ($startrot - $endrot) * $xx) * 256 * 256 ;zwischenrot
[/autoit]
$g = Int($startgruen - ($startgruen - $endgruen) * $xx) * 256 ;zwischengruen
$b = Int($startblau - ($startblau - $endblau) * $xx) ;zwischenblau
Return $r + $g + $b
EndFunc ;==>_createcolorfrompalette -
In der GDIp.au3 findest du die Funktion _GDIPlus_LineBrushCreate.
Damit kannst du einen Brush mit Farbverlauf erstellen;
und mit _GDIPlus_GraphicsFillPolygon zeichnest du dann das Dreieck.Um das Dreieck in mehrere Farbverläufe zu unterteilen musst du einfach das Dreieck in mehrere Abschnitte teilen...
mfgE
-
Dankeschön an euch beide.
Ich hab mich für eukalyptus' Vorschlag entschieden weil er für mich leichter zu verstehen ist(10+ Wochen keine Schule tun dem Kopf nicht gut).
Funktioniert auch perfekt.MfG
Higggiii