2010-03-02 4 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. , 그럼 내가 WPF, OpenGL을, 또는 XNA에 배를 점프 추천 수 Invalidate

를 호출합니다. GDI +는 애니메이션 용으로 설계되지 않았습니다 (Windows 메시지 루프는 실시간 시스템이 아니므로 항상 지터가 생깁니다).

+2

또한, 'Thread.Sleep' 대신 타이머를 사용하십시오. – SLaks

+0

# 1 ... 필요할 때 화면 버퍼에 렌더링을 수행하고 Paint 이벤트 처리기에서 BitBlt를 양식에 적용한다고 말한 것 같습니다. – overslacked

+0

@overslacked 네,하지만 실제로 그렇게 간단하지는 않습니다. 이상적으로는 터미널 서비스를 사용하지 않을 때만 백 버퍼로 그립니다. TS를 사용할 때는 컨텍스트에 직접 그려야합니다. 이를 단순화하기 위해 Microsoft는 OS/Framework 기반 이중 버퍼링을 수행하기 위해 GDI +에 일부 확장을 추가했습니다. –

관련 문제