下面是在Paint
事件中使用的多色LinearGradientBrush
一個例子:
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);
可以自由變化的顏色的數目,角度或止動點的傳播。只要確保你總是有相同數量的顏色和結束點,讓他們在0和結束從1開始
構造函數中的顏色被忽略了,順便說一句..
爲了得到一個點擊的顏色你可以編寫代碼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);
}
}
如果你想趕上多少點擊它可以更好地保持Bitmap
一類級別的變量,而不是重新創建它所有的時間..設置它作爲小組的BackgroundImage,如卡拉的回答假設也可能是一個不錯的選擇..
這應該回答標題中的問題。但是,您的第一張圖片不會顯示三種顏色的漸變。它顯示了四種顏色的2D漸變。對於這種更昂貴的着色方法,您應該將顏色置於Bitmap
並將其設置爲Panel
的BackgroundImage
..
更新下面是一段代碼,創建了一個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;
}
這裏是你如何使用它:
public Form1()
{
InitializeComponent();
panel4.BackgroundImage = Gradient2D(panel4.ClientRectangle,
Color.Black, Color.FromArgb(255, 0, 255, 0), Color.Red, Color.Yellow);
}
它使用簡單LinearGradientBrushes
不需要額外的顏色列表吧向下翻過Panel
的高度。
請注意,Color.Green
是一個相當黑暗的色調,所以我用FromRgb
爲更亮的綠色。如果您的Panel
大於256像素,則可以通過填充較大的條紋來進行優化; IFS它是垂直的,你可能要改變回路中去X代替Ÿ過..
下面是結果:
點擊式接你現在只需讀出彩從BackgroundImage
:
private void panel4_MouseClick(object sender, MouseEventArgs e)
{
clickedColor = ((Bitmap)panel4.BackgroundImage).GetPixel(e.X, e.Y);
}
而且,這種聯繫可能有助於回答大家的一些問題:https://msdn.microsoft.com/en-us/magazine/cc164113.aspx –
見我的答案更新..! – TaW