最小化屏幕时C#LinearGradientBrush毛刺

我有以下代码在我的winform上创建混合背景:

public partial class Aging : Form { protected override void OnPaintBackground(PaintEventArgs e) { using (var brush = new LinearGradientBrush(this.ClientRectangle, Color.Transparent, Color.Transparent, LinearGradientMode.Vertical)) { var blend = new ColorBlend(); blend.Positions = new[] { 0, 3 / 10f, 1 }; blend.Colors = new[] { Color.WhiteSmoke, Color.LightSteelBlue, Color.LightSteelBlue }; brush.InterpolationColors = blend; e.Graphics.FillRectangle(brush, this.ClientRectangle); } } 

结果是从LightSteelBlue到WhiteSmoke的颜色背景渐渐消失:

在此处输入图像描述

问题是如果我最小化屏幕然后最大化,应用程序不再显示背景:

在此处输入图像描述

这是我得到的exception消息:

 System.ArgumentException: Rectangle '{X=0,Y=0,Width=0,Height=0}' cannot have a width or height equal to 0. at System.Drawing.Drawing2D.LinearGradientBrush..ctor(Rectangle rect, Color color1, Color color2, LinearGradientMode linearGradientMode) at AgingStatusDb.Aging.OnPaintBackground(PaintEventArgs e) at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer) at System.Windows.Forms.Control.WmEraseBkgnd(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at System.Windows.Forms.Form.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

我不是那么精明,而且我无法找出故障的根源。 任何帮助,将不胜感激。

要解决exception,只需按照exception消息所说的内容:

矩形'{X = 0,Y = 0,宽度= 0,高度= 0}’的宽度或高度不能等于0。

所以你可以简单地检查ClientRectangle.Width==0ClientRectangle.Height==0然后什么也不做,只是返回。

但修复错误后,在最小化和恢复后,您将获得黑色背景。

如果您想绘制表单的背景,上面的代码需要一些更正:

  • 您需要设置控件以在resize时重绘自身。 为此,您应该设置this.SetStyle(ControlStyles.ResizeRedraw, true); 在构造函数中。

  • 您需要启用双缓冲以防止闪烁。 所以在构造函数中设置this.DoubleBuffered = true;

 public Form1() { InitializeComponent(); this.DoubleBuffered = true; this.SetStyle(ControlStyles.ResizeRedraw, true); } protected override void OnPaintBackground(PaintEventArgs e) { if (ClientRectangle.Width == 0 || ClientRectangle.Height == 0) return; using (var brush = new LinearGradientBrush(this.ClientRectangle, Color.Transparent, Color.Transparent, LinearGradientMode.Vertical)) { var b = new ColorBlend(); b.Positions = new[] { 0, 3 / 10f, 1 }; b.Colors = new[] { Color.WhiteSmoke, Color.LightSteelBlue, Color.LightSteelBlue }; brush.InterpolationColors = b; e.Graphics.FillRectangle(brush, this.ClientRectangle); } } 

有最简单的方法来淡化背景。

在图形编辑器中使用渐变创建图像或使用代码,但保存它:

 protected override void OnLoad(EventArgs e) { using (var brush = new LinearGradientBrush(this.ClientRectangle, Color.Transparent, Color.Transparent, LinearGradientMode.Vertical)) { var blend = new ColorBlend(); blend.Positions = new[] { 0, 3 / 10f, 1 }; blend.Colors = new[] { Color.WhiteSmoke, Color.LightSteelBlue, Color.LightSteelBlue }; brush.InterpolationColors = blend; using (var bmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height)) { var g = Graphics.FromImage(bmp); g.FillRectangle(brush, ClientRectangle); bmp.Save("background.png", ImageFormat.Png); } } } 

运行并关闭应用程序。 然后删除该代码。

最后,设置在上一步中创建的表单背景图像:

 this.DoubleBuffered = true; this.BackgroundImageLayout = ImageLayout.Stretch; this.BackgroundImage = new Bitmap("background.png");