Ecco un esempio di utilizzo di un multicolore LinearGradientBrush
nel caso Paint
:
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);
Si può liberamente variare il numero di colori, l'angolo o la diffusione dei punti di arresto. Basta fare in modo di avere sempre lo stesso numero di colori e smettere di punti e far loro partono da 0 e terminano alle 1.
I colori nel costruttore vengono ignorati, btw ..
per ottenere un colore cliccato si può codificare il 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);
}
}
Se si desidera catturare il numero di clic può essere meglio per mantenere il Bitmap
in una variabile livello di classe, invece di ricreare tutto il tempo .. Impostazione come BackgroundImage del panel, come Kala di la risposta assume potrebbe anche essere una buona opzione ..
Questo dovrebbe rispondere alla domanda nel titolo. Tuttavia la tua prima immagine non mostra una sfumatura con tre colori. Mostra un gradiente 2D con quattro colori. Per un metodo di colorazione così costoso dovresti inserire i colori in un Bitmap
e impostarlo come BackgroundImage
Panel
..
aggiornamento Ecco un pezzo di codice che crea un gradiente 2D:
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;
}
Ecco come lo si utilizza:
public Form1()
{
InitializeComponent();
panel4.BackgroundImage = Gradient2D(panel4.ClientRectangle,
Color.Black, Color.FromArgb(255, 0, 255, 0), Color.Red, Color.Yellow);
}
Questo utilizza semplice LinearGradientBrushes
senza una lista di colori in più che va giù sopra l'altezza del Panel
.
Si noti che Color.Green
è una tonalità piuttosto scura, quindi ho utilizzato FromRgb
per un verde più luminoso. Se il tuo Panel
è superiore a 256 pixel, potresti voler eseguire l'ottimizzazione riempendo strisce più grandi; IFS è verticale, si può decidere di cambiare il ciclo di andare oltre x invece di y ..
Ecco il risultato:
Per raccogliere con un click ora semplicemente leggere il colore dal BackgroundImage
:
private void panel4_MouseClick(object sender, MouseEventArgs e)
{
clickedColor = ((Bitmap)panel4.BackgroundImage).GetPixel(e.X, e.Y);
}
Inoltre, questo link potrebbe aiutare a rispondere alle vostre domande: https://msdn.microsoft.com/en-us/magazine/cc164113.aspx –
Vedere la mia risposta aggiornato ..! – TaW