여기 코드가 있습니다. 당신은 먼저 컨트롤의 크기와 배경 버퍼 비트 맵을 만들 필요가있다. 그런 다음, 비트 맵에 모든 것을 그려야하고 비트 맵을 컨트롤에 그려야합니다. 새로운 Bitmap
에게 당신이 TableLayoutPanel
크기를 조정할 때마다 작성해야합니다
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();
}
참고. 또한 Refresh()
대신 Invalidate()
을 사용하는 것이 좋습니다.
그러나 여기에는 여전히 약간의 깜박임이 포함됩니다. 깜박임을 완전히 피하려면 앞의 코드 외에도 TableLayoutPanel
의 하위 클래스를 만들고 base.OnPaintBackground
이 호출되지 않도록 OnPaintBackground()
메서드를 재정의해야합니다. 이 방법은 전혀 깜박 거리지 않습니다. 깜박 거리는 이유는 언제든지 그릴 때 배경이 다시 그려지므로 Rectangle
입니다. 항상 도움이되지 않습니다 true로에 Doublebuffer 설정? 코드를 제공 할 수있는이 BackgroundlessTableLayoutPanel
public class BackgroundlessTableLayoutPanel : TableLayoutPanel
{
protected override void OnPaintBackground(PaintEventArgs e)
{
}
}
원래
TableLayoutPanel
클래스를 전환합니다. –물론 코드를 단순화하여 문제가 어딘가에 있다고 생각하는 곳으로 오지 않도록하십시오. – CodeCamper
Nikola가 코드를 추가했습니다. Timer와 TableLayoutPanel을 만들고 새 프로젝트에서 코드를 팝하면 깜박임이 보일 것입니다. – CodeCamper