Я понятия не имею, почему это происходит, но я создал приведенный ниже код, который представляет собой панель градиента, затем панель прикрепляется к левой части экрана.
Когда форма изменяется, она отображается правильно, однако, если вы свернете форму, а затем восстановите ее, вы получите большой красный крестик вместо градиента.
Может ли кто-нибудь заметить ошибку?
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
в обработчикеOnPaintBackground
. Я предполагаю, что вы, возможно, достигли предела своего объекта GDI (который вы можете проверить в диспетчере задач), поскольку я не думаю, что вы правильно размещаете свои кисти. Переместите это в конструктор или в функцию, которая вызывается при изменении свойств цветов и стилей (и избавьтесь от предыдущего перед созданием нового) - person musefan   schedule 21.02.2012