Как исправить мерцание в форме WinForms? - PullRequest
16 голосов
/ 02 марта 2010

Я постоянно рисую рамки, и мне нужно, чтобы форма не мерцала. Как мне это сделать?

public partial class Form1 : Form
{
    Image[] dude = new Image[3];
    static int renderpoint = 0;
    int lastimage = 0;

    public Form1()
    {
        dude[1] = new Bitmap(@"snipe1.bmp");
        dude[0] = new Bitmap(@"snipe0.bmp");

        InitializeComponent();
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        MainLoop();
    }

    private void MainLoop()
    {
        double FPS = 10;

        long ticks1 = 0;
        long ticks2 = 0;
        double interval = (double)Stopwatch.Frequency / FPS;

        while (true)
        {
            ticks2 = Stopwatch.GetTimestamp();
            if (ticks2 >= ticks1 + interval)
            {
                ticks1 = Stopwatch.GetTimestamp();

                MoveGraphics();
                this.Refresh(); 
            }

            Thread.Sleep(1); 
        }
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        Rectangle rect = new Rectangle(renderpoint, 0, 100, 100);
        Color lowcolor = Color.FromArgb(0, 128, 64);
        Color highcolor = Color.FromArgb(0, 128, 64);

        ImageAttributes imageAttr = new ImageAttributes();
        imageAttr.SetColorKey(lowcolor, highcolor);

        if (lastimage == 1)
        {
            lastimage = 0;
            g.DrawImage(dude[1], rect, 0, 0, 100, 100, GraphicsUnit.Pixel, imageAttr);
        }
        else
        {
            lastimage = 1;
            g.DrawImage(dude[0], rect, 0, 0, 100, 100, GraphicsUnit.Pixel, imageAttr);
        }  
    }

    void MoveGraphics()
    {
        if (renderpoint > 950)
        {
            renderpoint = 0;
        }
        else
        {
            renderpoint += 10;
        }
    }
}

Там текущий код. Предложения?

Ответы [ 2 ]

13 голосов
/ 02 марта 2010

Вставьте это в ваш конструктор Form1:

this.DoubleBuffered = true;
12 голосов
/ 02 марта 2010
  1. Выполните рендеринг в обработчике событий Paint
  2. Отключить автоматическое стирание фона.
  3. Включить двойную буферизацию либо с помощью стилей, либо вручную.
  4. Если вы хотите перекрасить, звоните Invalidate

Если вы пытаетесь использовать плавную анимацию, тогда я могу порекомендовать перейти с корабля на WPF, OpenGL или XNA. GDI + не был разработан для анимации (цикл сообщений Windows не является системой реального времени, поэтому у вас всегда будет дрожание).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...