0

TableLayoutPanel の上に長方形を描画していますが、それが大きくなると、Double Buffer を使用してもひどいちらつきが発生します。

e.Graphics.FillRectangle と、四角形のサイズを大きくするグローバル変数を使用しています。1/10 秒ごとに 1 ピクセルずつ大きくなるようにタイマーを設定しました。ちらつきが激しいのはなぜですか? また、ちらつきを止めるにはどうすればよいですか?

 int grow = 100;
    private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.Red, (tableLayoutPanel1.Width-grow)/2, (tableLayoutPanel1.Height-grow)/2, grow,grow);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        grow += 10;
        tableLayoutPanel1.Refresh();
    }

他のすべての可能性を排除するために、プログラムからすべてを削除し、長方形を成長させるだけでゼロから始めましたが、それでもこの恐ろしいちらつきが発生します。

4

2 に答える 2

3

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

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.OnPaintBackgroundRectangleTableLayoutPanelBackgroundlessTableLayoutPanel

public class BackgroundlessTableLayoutPanel : TableLayoutPanel
{
    protected override void OnPaintBackground(PaintEventArgs e)
    {

    }
}
于 2013-06-18T10:49:54.253 に答える
-1

ほとんどのコントロールには、必要なカスタム描画を実装できるPaintイベントがあります。OnPaintメソッドをオーバーライドする独自のコントロールを実装することもできます。こちらの記事をご覧ください

これらはどちらも問題のない結果をもたらすはずです。

于 2013-06-18T10:09:21.870 に答える