2

ちらつきを取り除くためにダブルバッファリングを実行しようとしていますが、画像のちらつきを再描画します。新しい場所のバーに周期的に画像を再描画する必要があります。これでうまくいきます。しかし、非常に目立つちらつきを再描画するとき。助けてください。

namespace CockroachRunning
{
    public partial class Form1 : Form
    {
        Random R = new Random();
        Semaphore s1 = new Semaphore(2, 4);
        Bitmap cockroachBmp = new Bitmap(Properties.Resources.cockroach, new Size(55, 50));
        List<Point> cockroaches = new List<Point>();
        public Form1()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
            cockroaches.Add(new Point(18,13));
            Thread t1 = new Thread(Up);
            t1.Start();
        }
        public void Up()
        {
            while (true) 
            {
                s1.WaitOne();
                int distance = R.Next(1, 6);
                for (int i = 0; i < distance; i++)
                {
                    if (cockroaches[0].Y - 1 > -1)
                    {
                        cockroaches[0] = new Point(cockroaches[0].X, cockroaches[0].Y - 1);
                        panel1.Invalidate();                        
                    }
                }
                s1.Release();
                Thread.Sleep(100);
            }
        }
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Image i = new Bitmap(panel1.ClientRectangle.Width, panel1.ClientRectangle.Height);
            Graphics g = Graphics.FromImage(i);
            Graphics displayGraphics = e.Graphics;
            g.DrawImage(cockroachBmp, cockroaches[0]);
            displayGraphics.DrawImage(i, panel1.ClientRectangle);
        }
    }
}
4

1 に答える 1

3

ちらつきを取り除くために、次の設定を使用して、コントロールの動作を構成します。

base.DoubleBuffered = true;

SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();

Controlこれを派生クラスのコンストラクターで呼び出します。これがフォームでも機能するかどうかはわかりませんが、機能すると思います。

void OnPaintBackground(PaintEventArgs e)次に、 (クライアント領域の消去)およびvoid OnPaint(PaintEventArgs e)(実際の描画)で描画が行われます。

于 2012-05-23T12:38:22.110 に答える