わかりました、これがコードです。最初に、コントロールのサイズでバックグラウンド バッファー ビットマップを作成する必要があります。その後、ビットマップにすべてを描画し、そのビットマップをコントロールに描画する必要があります。
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)
{
}
}