2010-05-13 4 views
0

C# .Net의 Windows Forms 응용 프로그램에 대한 내 자신의 사용자 지정 컨트롤을 작성하려고합니다. 현재 페인트 이벤트를 사용하여 일부 직사각형 및 기타 그래픽 요소를 페인트합니다. 이제 앱 크기를 바탕 화면 크기에 맞게 조정하면 모든 요소가 다시 그려지지만 필요한 이전 동작은 배경에 표시됩니다.C# - 크기를 조정할 때 화면 지우기

Pen penDefaultBorder = new Pen(Color.Wheat, 1); 
int margin = 5; 
private void CustomControl_Paint(object sender, PaintEventArgs e) { 
    CustomControl calendar = (CustomControl)sender; 
    Graphics graphics = e.Graphics; 
    graphics.Clear(Color.WhiteSmoke); 

    graphics.DrawRectangle(penDefaultBorder, margin, margin, calendar.Width - margin * 2, calendar.Height - margin * 2); 
    //... 
} 

어느 쪽도 아니 graphics.Clear을,도 아니다 graphics.FillRectangle (...)를 추가하면면에서 기존의 사각형을 숨길 수 :

는 여기에 내가 지금 뭘하는지입니다.

아이디어가 있으십니까? 다들 감사 해요.

답변

1

양식을 다시 그리기 위해 .Invalidate()을 사용해 보셨습니까?

+0

이렇게하면됩니다. 약간의 샷건 접근법이지만 작동 할 것입니다. 나는 여전히 변경이 필요할 때만 버퍼를 렌더링하고 OnPaint에서 요청한 영역을 복사하는 것을 선호합니다. – overslacked

+0

흠 - 이것은 쉽습니다 ;-) 도움을 주셔서 감사합니다. 이제 크기 조정 작업이 예상대로 작동합니다. – dhh

2

페인트 이벤트는 일반적으로 PaintEventArgs에 지정된 영역 만 전체 캔버스에 대한 업데이트를 요청하지 않습니다. 무슨 일이 벌어지고 있는지 추측하고 있는데, 새로 노출 된 캔버스 영역 만 PaintEventArgs에 전달된다는 것입니다.

그림판 이벤트에서 렌더링을해서는 안되는 이유 중 하나입니다. 오프 스크린 비트 맵 (버퍼)에 렌더링하고 해당 버퍼에서 Paint 이벤트의 컨트롤 캔버스로 복사해야합니다.

여기 또는 Google에서 '이중 버퍼링'을 검색하면 기술에 대한 많은 예가 제공됩니다.

+0

힌트를 보내 주셔서 감사합니다. 이중 버퍼링과 관련하여 흥미로운 기사를 발견했습니다. 나는 그것들을 살펴볼 것이다. – dhh