gpt4 book ai didi

c# - 渐变面板在最小化然后恢复时显示红叉

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:39 25 4
gpt4 key购买 nike

我不知道为什么会这样,但我创建了下面的代码,它是一个渐变面板,然后该面板停靠在屏幕的左侧。

当调整表单大小时它会正确显示,但是如果你最小化表单然后恢复它你会得到一个大的红色 X 而不是渐变。

谁能发现错误?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;

public class GradientPanel : Panel
{
private Color ColorA = Color.LightBlue;
private Color ColorB = Color.Red;
private LinearGradientMode GradientFillStyle = LinearGradientMode.ForwardDiagonal;
private Brush gradientBrush;

public Color colourStart
{
get { return ColorA; }
set { ColorA = value; Invalidate(); }
}
public Color colourEnd
{
get { return ColorB; }
set { ColorB = value; Invalidate(); }
}
public LinearGradientMode colourGradientStyle
{
get { return GradientFillStyle; }
set { GradientFillStyle = value; Invalidate(); }
}

public GradientPanel()
{
handlerGradientChanged = new EventHandler(GradientChanged);
ResizeRedraw = true;
}

private EventHandler handlerGradientChanged;

protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs e)
{
gradientBrush = new LinearGradientBrush(ClientRectangle, ColorA, ColorB, GradientFillStyle);

e.Graphics.FillRectangle(gradientBrush, ClientRectangle);
}

protected override void Dispose(bool disposing)
{
if (disposing)
{
if (gradientBrush != null) gradientBrush.Dispose();
}
base.Dispose(disposing);
}

protected override void OnResize(EventArgs eventargs)
{
Invalidate();
//base.OnResize(eventargs);
}
protected override void OnSizeChanged(EventArgs e)
{
Invalidate();
//base.OnSizeChanged(e);
}
private void GradientChanged(object sender, EventArgs e)
{
if (gradientBrush != null) gradientBrush.Dispose();
gradientBrush = null;
Invalidate();
}

}

最佳答案

我正在做类似的事情,但即使清理 LinearGradientBrush 也没有为我修复它。查看控制台输出,我注意到“System.ArgumentException 类型的第一次机会异常发生在 System.Drawing.dll 中。”我相信这是因为当组件最小化时 ClientRectangle 为 0,0。添加这段代码似乎为我解决了这个问题:

  protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);
if (this.gradientBrush != null)
this.gradientBrush.Dispose();
if (this.ClientRectangle.Width > 0 && this.ClientRectangle.Height > 0)
{
this.gradientBrush = new LinearGradientBrush(this.ClientRectangle,
FROM_GRADIENT_COLOR, TO_GRADIENT_COLOR, LinearGradientMode.Horizontal);

e.Graphics.FillRectangle(this.gradientBrush, this.ClientRectangle);
}
}

关于c# - 渐变面板在最小化然后恢复时显示红叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9377337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com