填充矩形在表单上丢失最小化

时间:2013-12-16 17:53:38

标签: c# winforms

我使用以下代码填充面板。但是每当我最小化表单时,矩形的填充部分就会丢失。

任何想法我做错了什么?感谢

   public static void populateTable(this Panel p, int x, int y)
    {
            Graphics g = p.CreateGraphics();            
            Brush b = new SolidBrush(Color.DarkCyan);
            g.FillRectangle(b, x, y,100,40);
            g.Dispose();
    }

1 个答案:

答案 0 :(得分:2)

每次面板重新绘制时都需要重新绘制(例如,从最小化恢复窗口时)。正确的方法是使用Paint事件并存储您需要以某种形式的集合绘制的对象,并在每次调用时重新绘制它们。

public Form1()
{
    InitializeComponent();
    rectangles = new List<Rectangle>();
    panel1.Paint += panel1_Paint;
}


public void PopuplateTable(int x, int y)
{
    rectangles.Add(new Rectangle(x,y, 100, 40));

    //Forces a redraw to happen.
    panel1.Invalidate();
}

private List<Rectangle> rectangles; 

void panel1_Paint(object sender, PaintEventArgs e)
{
    foreach (var rectangle in rectangles)
    {
        using (var b = new SolidBrush(Color.DarkCyan))
        {
            e.Graphics.FillRectangle(b, rectangle);
        }
    }
}

现在这与您当前的代码不完全相同,但它指出了正确的方向,因此您可以调整代码以执行相同的操作。您可能需要根据Panel创建一个新类来保留PopulateTable来电而不是使用扩展方法,如果您最终这样做,则应覆盖OnPaint而不是使用油漆事件。

class MyPanel : Panel
{

    private Rectangle? paintedRectangle = null;

    public void PopuplateTable(int x, int y)
    {
        paintedRectangle = new Rectangle(x, y, 100, 40);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        if (paintedRectangle.HasValue)
        {
            using (var b = new SolidBrush(Color.DarkCyan))
            {
                e.Graphics.FillRectangle(b, paintedRectangle.Value);
            }
        }
    }
}