好的,这里是代码。您首先需要使用控件的大小制作背景缓冲区位图。之后,您将需要在位图上绘制所有内容,然后将该位图绘制到控件上。
Bitmap backBuffer = null;
int grow = 100;
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
if (backBuffer == null)
backBuffer = new Bitmap(tableLayoutPanel1.Width, tableLayoutPanel1.Height);
Graphics g = Graphics.FromImage(backBuffer);
g.Clear(tableLayoutPanel1.BackColor);
g.FillRectangle(Brushes.Red, (tableLayoutPanel1.Width - grow) / 2, (tableLayoutPanel1.Height - grow) / 2, grow, grow);
e.Graphics.DrawImage(backBuffer, 0, 0, backBuffer.Width, backBuffer.Height);
g.Dispose();
}
private void tableLayoutPanel1_Resize(object sender, EventArgs e)
{
backBuffer = null;
}
private void timer1_Tick(object sender, EventArgs e)
{
grow += 10;
tableLayoutPanel1.Invalidate();
}
请注意,Bitmap
每次调整TableLayoutPanel
. 另外我建议使用Invalidate()
而不是Refresh()
.
但这仍将包括一些潜在的闪烁。为了完全避免闪烁,除了前面的代码之外,您还需要将方法子类化并以永远不会调用的方式TableLayoutPanel
覆盖该OnPaintBackground()
方法。base.OnPaintBackground
这种方式根本不会有任何闪烁。你有闪烁的原因是因为背景在你之前重新绘制Rectangle
,任何时候你绘制它。用这个切换原来的TableLayoutPanel
类BackgroundlessTableLayoutPanel
public class BackgroundlessTableLayoutPanel : TableLayoutPanel
{
protected override void OnPaintBackground(PaintEventArgs e)
{
}
}