我使用以下代码填充面板。但是每当我最小化表单时,矩形的填充部分就会丢失。
任何想法我做错了什么?感谢
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();
}
答案 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);
}
}
}
}