如何在 WinForms 中创建多色线性渐变?System.Drawing.Drawing2D.LinearGradientBrush 只允许两种颜色。
问问题
25154 次
2 回答
62
与此处相同的答案: winforms 中的多色对角线渐变 winforms 中的多色对角线渐变
这是一个小例子
void MainFormPaint(object sender, PaintEventArgs e)
{
LinearGradientBrush br = new LinearGradientBrush(this.ClientRectangle, Color.Black, Color.Black, 0 , false);
ColorBlend cb = new ColorBlend();
cb.Positions = new[] {0, 1/6f, 2/6f, 3/6f, 4/6f, 5/6f, 1};
cb.Colors = new[] {Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Indigo, Color.Violet};
br.InterpolationColors= cb;
// rotate
br.RotateTransform(45);
// paint
e.Graphics.FillRectangle(br, this.ClientRectangle);
}
这是结果
希望这可以帮助
于 2011-12-06T20:24:09.403 回答
0
我创建了一个面板,因为我可以将它用作我的项目的容器。代码非常简单,即如果您想实现 Punker76 提供的不停止。
public partial class GradientPanel : Panel
{
private Color _startColor = Color.Transparent;
private Color _stopColor = Color.Transparent;
private bool _angleScales = false;
private int _angle = 0;
/// <summary>
/// litle helper to redraw when property changes, a litle OnNofifyChanged for the
/// IDE causing it to update
/// </summary>
/// <typeparam name="T">Making sure the values are comparable</typeparam>
/// <param name="field">the field that is compared</param>
/// <param name="value">the value that is assigned</param>
/// <remarks>Updates re-paints the panel when needed</remarks>
private void Set<T>(ref T field, T value)
{
if (field.Equals(value))
return;
field = value;
base.Refresh();
}
[Category("Appearence"),Description("Specifies the start colour")]
public Color StartColor { get => _startColor; set => Set(ref _startColor, value); }
[Category("Appearence"), Description("Specifies the stop colour")]
public Color StopColor { get => _stopColor; set => Set(ref _stopColor, value); }
[Category("Appearence"), Description("The angle, measured in degrees clockwise from the x-axis, of the gradient's orientation line.")]
public int Angle { get => _angle; set => Set(ref _angle , value); }
[Category("Appearence"), Description("If Set to true to specify that the angle is affected by the transform associated with this panel")]
public bool AngleScales { get => _angleScales; set => Set(ref _angleScales, value); }
protected override void OnPaint(PaintEventArgs e)
{
LinearGradientBrush br = new LinearGradientBrush(e.ClipRectangle, StartColor, StopColor, Angle, AngleScales);
e.Graphics.FillRectangle(br, e.ClipRectangle);
base.OnPaint(e);
}
}
拥有一个控件可以让重用变得更加高效。请记住,当您在控件中进行更改时,您可能需要重新构建项目才能看到更改生效。
于 2018-05-01T08:42:33.417 回答