2013-06-18 2 views
0

성장하는 사각형이 TableLayoutPanel 위에 그려지지만 성장하면 Double Buffer를 사용해도 깜박 거립니다.Growing Rectangle

나는 e.Graphics.FillRectangle과 사각형의 크기를 증가시키는 전역 변수를 사용하고 있습니다. 타이머가 1/10th마다 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(); 
    } 

하고 여전히이 끔찍한 깜박임을 만듭니다.

+2

원래 TableLayoutPanel 클래스를 전환합니다. –

+0

물론 코드를 단순화하여 문제가 어딘가에 있다고 생각하는 곳으로 오지 않도록하십시오. – CodeCamper

+0

Nikola가 코드를 추가했습니다. Timer와 TableLayoutPanel을 만들고 새 프로젝트에서 코드를 팝하면 깜박임이 보일 것입니다. – CodeCamper

답변

3

여기 코드가 있습니다. 당신은 먼저 컨트롤의 크기와 배경 버퍼 비트 맵을 만들 필요가있다. 그런 다음, 비트 맵에 모든 것을 그려야하고 비트 맵을 컨트롤에 그려야합니다. 새로운 Bitmap에게 당신이 TableLayoutPanel 크기를 조정할 때마다 작성해야합니다

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

참고. 또한 Refresh() 대신 Invalidate()을 사용하는 것이 좋습니다.

그러나 여기에는 여전히 약간의 깜박임이 포함됩니다. 깜박임을 완전히 피하려면 앞의 코드 외에도 TableLayoutPanel의 하위 클래스를 만들고 base.OnPaintBackground이 호출되지 않도록 OnPaintBackground() 메서드를 재정의해야합니다. 이 방법은 전혀 깜박 거리지 않습니다. 깜박 거리는 이유는 언제든지 그릴 때 배경이 다시 그려지므로 Rectangle입니다. 항상 도움이되지 않습니다 true로에 Doublebuffer 설정? 코드를 제공 할 수있는이 BackgroundlessTableLayoutPanel

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

    } 
} 
+0

나는이 새로운 비트 맵 버퍼 개념을 배우는 것을 즐겼지 만, 머리에 진짜 못을 박는 것처럼 보입니다. 'OnPaintBackground'는 Paint 메소드 전에 트리거되고 성능과 무관 한 플리커가 발생합니다. OnPaintBackGround를 수정할 때 내 양식에서 내 바탕 화면의 고정 된 복사본을 볼 수 있기 때문에 어떻게 수정해야하는지 자세히 설명해주십시오. – CodeCamper

+0

OnPaintBackground를 사용하지 않도록 설정하면 많은 의도하지 않은 결과가 발생하지만 문제의 근원이므로 문제를 해결하는 가장 좋은 방법은 무엇입니까? 단순히 비활성화하면 화면에서 내 양식을 드래그하여 고정 된 효과를 만들고 배경을 복제합니다. – CodeCamper

+0

Backbuffer가 배경 역할을 할 수 있도록 Rectangle을 그리기 전에 매번 배경색이있는 비트 맵을 지 웁니다. –

-1

대부분의 컨트롤에는 수행 할 사용자 지정 그림을 구현할 수있는 Paint 이벤트가 있습니다. OnPaint 메서드를 재정의하는 경우 사용자 지정 컨트롤을 구현할 수도 있습니다. See the article here.

이 두 가지 모두 괜찮은 결과를 제공해야합니다.

+0

아니요, 패널을 배경으로 다시 그리는 경우 더 느린 컴퓨터에서 깜박임이 발생할 수 있으므로 백 버퍼 비트 맵을 그려 문제를 해결할 수 있습니다. 또한 OP에서 e.Graphics를 사용하기 때문에 Paint 이벤트 핸들러를 이미 사용했다고 가정합니다. –

+0

완벽, 좋음, 좋음, 보통, [ok], 나쁨. 이제 깜박임을 제거하면됩니다. Nikola, 비트 맵을 사용하여이 깜박임을 제거하는 데 도움을 주시면 감사하겠습니다. Winform에서 약간의 동적 애니메이션을 수행하려고합니다. – CodeCamper