ist ein Beispiel für die Verwendung einer Mehrfarbe LinearGradientBrush
im Paint
Ereignisse:
LinearGradientBrush linearGradientBrush =
new LinearGradientBrush(panel4.ClientRectangle, Color.Red, Color.Yellow, 45);
ColorBlend cblend = new ColorBlend(3);
cblend.Colors = new Color[3] { Color.Red, Color.Yellow, Color.Green };
cblend.Positions = new float[3] { 0f, 0.5f, 1f };
linearGradientBrush.InterpolationColors = cblend;
e.Graphics.FillRectangle(linearGradientBrush, panel4.ClientRectangle);
Sie frei, die Anzahl der Farben variieren können, um den Winkel oder die Ausbreitung der Anschlagpunkte. So stellen Sie sicher, dass Sie immer die gleiche Anzahl von Farben haben und Haltepunkte und lassen Sie sie bei 0 und endet am 1.
Die Farben im Konstruktor beginnen ignoriert werden, btw ..
Um eine klickten Farbe erhalten Sie kann Code die MouseClick
:
Color clickedColor = Color.Empty;
private void panel4_MouseClick(object sender, MouseEventArgs e)
{
using (Bitmap bmp = new Bitmap(panel4.ClientSize.Width, panel4.ClientSize.Height))
{
panel4.DrawToBitmap(bmp,panel4.ClientRectangle);
clickedColor = bmp.GetPixel(e.X, e.Y);
}
}
Wenn Sie viele Klicks fangen wollen kann es besser sein, die Bitmap
in einer Klassenstufe variabel zu halten, anstatt es die ganze Zeit neu zu erstellen .. sie als Background Panel einstellen, wie Kala Antwort geht davon aus, dass auch eine gute Option sein könnte.
Dies sollte die Frage im Titel beantworten. Ihr erstes Bild zeigt jedoch keinen Farbverlauf mit drei Farben. Es zeigt einen 2D-Verlauf mit vier Farben. Für solch eine teurere Färbemethode sollten Sie die Farben in eine Bitmap
setzen und sie als Panel
's BackgroundImage
setzen.
aktualisieren hier ein Stück Code, das eine 2D-Gradient erzeugt:
Bitmap Gradient2D(Rectangle r, Color c1, Color c2, Color c3, Color c4)
{
Bitmap bmp = new Bitmap(r.Width, r.Height);
float delta12R = 1f * (c2.R - c1.R)/r.Height;
float delta12G = 1f * (c2.G - c1.G)/r.Height;
float delta12B = 1f * (c2.B - c1.B)/r.Height;
float delta34R = 1f * (c4.R - c3.R)/r.Height;
float delta34G = 1f * (c4.G - c3.G)/r.Height;
float delta34B = 1f * (c4.B - c3.B)/r.Height;
using (Graphics G = Graphics.FromImage(bmp))
for (int y = 0; y < r.Height; y++)
{
Color c12 = Color.FromArgb(255, c1.R + (int)(y * delta12R),
c1.G + (int)(y * delta12G), c1.B + (int)(y * delta12B));
Color c34 = Color.FromArgb(255, c3.R + (int)(y * delta34R),
c3.G + (int)(y * delta34G), c3.B + (int)(y * delta34B));
using (LinearGradientBrush lgBrush = new LinearGradientBrush(
new Rectangle(0,y,r.Width,1), c12, c34, 0f))
{ G.FillRectangle(lgBrush, 0, y, r.Width, 1); }
}
return bmp;
}
Hier ist, wie Sie es verwenden:
public Form1()
{
InitializeComponent();
panel4.BackgroundImage = Gradient2D(panel4.ClientRectangle,
Color.Black, Color.FromArgb(255, 0, 255, 0), Color.Red, Color.Yellow);
}
Diese einfache verwendet LinearGradientBrushes
ohne eine zusätzliche Liste Farben gehen hinunter über die Höhe des Panel
.
Beachten Sie, dass Color.Green
ein eher dunkler Farbton ist, also habe ich FromRgb
für ein helleres Grün verwendet. Wenn Ihr Panel
größer als 256 Pixel ist, möchten Sie möglicherweise durch Füllen größerer Streifen optimieren. Ifs ist vertikal Sie die Schleife ändern zu gehen über x statt y ..
Hier ist das Ergebnis möchten:
Um wählen Sie mit einem Klick Sie jetzt einfach ausgelesen, um die Farbe die von BackgroundImage
:
private void panel4_MouseClick(object sender, MouseEventArgs e)
{
clickedColor = ((Bitmap)panel4.BackgroundImage).GetPixel(e.X, e.Y);
}
auch könnte diese Verbindung einige Ihrer Fragen helfen beantworten: https://msdn.microsoft.com/en-us/magazine/cc164113.aspx –
meine Antwort aktualisiert Siehe ..! – TaW