下面是在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