最小化屏幕时 C# LinearGradientBrush 故障
C# LinearGradientBrush glitch when minimizing screen
我有以下代码在我的 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:
问题是如果我最小化屏幕然后最大化,应用程序不再显示背景:
这是我收到的异常消息:
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)
我不是那么精明,我无法找出故障的根源。任何帮助将不胜感激。
要解决异常,只需按照异常消息所说的进行操作:
Rectangle '{X=0,Y=0,Width=0,Height=0}' cannot have a width or height
equal to 0.
因此您可以简单地检查 ClientRectangle.Width==0
或 ClientRectangle.Height==0
然后什么都不做,只是 return。
但是修复错误后,最小化和恢复后你会看到黑色背景。
如果你想画一个表格的背景,上面的代码需要一些修改:
您需要将控件设置为在调整大小时自行重绘。为此,您应该在构造函数中设置 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");
我有以下代码在我的 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:
问题是如果我最小化屏幕然后最大化,应用程序不再显示背景:
这是我收到的异常消息:
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)
我不是那么精明,我无法找出故障的根源。任何帮助将不胜感激。
要解决异常,只需按照异常消息所说的进行操作:
Rectangle '{X=0,Y=0,Width=0,Height=0}' cannot have a width or height equal to 0.
因此您可以简单地检查 ClientRectangle.Width==0
或 ClientRectangle.Height==0
然后什么都不做,只是 return。
但是修复错误后,最小化和恢复后你会看到黑色背景。
如果你想画一个表格的背景,上面的代码需要一些修改:
您需要将控件设置为在调整大小时自行重绘。为此,您应该在构造函数中设置
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");