2010-03-02 7 views
15

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

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; 
     } 
    } 
} 

Существует текущий код. Предложения?

+0

C# не имеет формы. –

ответ

12

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

this.DoubleBuffered = true; 
+0

Кажется, что все отлично работает ... Но протягивайте присяжные, пока я не смогу проверить его с большей и одновременной графикой. – Bloodyaugust

12
  1. Сделайте свою визуализацию в обработчике Paint событий
  2. Отключить автоматическое стирание фона.
  3. Включить двойную буферизацию через стили или вручную.
  4. Если вы хотите, чтобы перекрасить, вызовите Invalidate

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

+2

Также используйте таймер вместо 'Thread.Sleep'. – SLaks

+0

# 1 ... Я думаю, вы хотели сказать, как сделать рендеринг в буфер вне экрана, когда это необходимо, и просто BitBlt в вашу форму в обработчике событий Paint. – overslacked

+0

@overslacked Да, но на самом деле это не так просто. В идеале вы будете использовать только обратный буфер, если не используете Terminal Services. При использовании TS вы должны напрямую рисовать контекст. Чтобы упростить это, Microsoft добавила некоторые расширения для GDI + для выполнения двойной буферизации на основе OS/Framework. –

Смежные вопросы