2012-02-11 4 views
4

일 때 base.OnPaint()를 호출해야합니까? Windows form 프로그램에서 OnPaint를 재정의 할 때 base.OnPaint를 호출해야하는 시점은 궁금합니다.언제 우리가

내가 뭐하는 거지입니다 :

private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      // If there is an image and it has a location, 
      // paint it when the Form is repainted. 
      base.OnPaint(e); 

     } 

나는 stackoerflowexception을받을 이유는 무엇입니까?

답변

6

OnPaint() 메서드를 재정의하지 않았습니다. Paint 이벤트에 방금 구독 중이므로 이 아니어야합니다. base.OnPaint()으로 전화하십시오.

protected override OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    // ... other drawing commands 
} 

윈도우에 OnPaint 방법은 실제로 Forms 컨트롤을 컨트롤의 Paint 이벤트를 발생하고, 또한 제어 표면을 그립니다 양식의 OnPaint() 메소드를 오버라이드 (override) 할 때
base.OnPaint() 전화 (수)해야한다. Paint 이벤트 처리기에서 기본 폼의 OnPaint 메서드를 호출하면 실제로 Paint 처리기를 반복해서 호출하도록 양식을 말하고 있으므로 무한 루프에 빠지게되므로 StackOverflowException이됩니다.

컨트롤의 OnPaint 메서드를 재정의하는 경우 일반적으로 기본 메서드를 호출하여 컨트롤이 그려 지도록하고 Paint 이벤트에 구독 된 이벤트 처리기를 호출해야합니다. 기본 메서드를 호출하지 않으면 일부 컨트롤 측면이 그려지지 않으며 이벤트 처리기가 호출되지 않습니다.

+0

재정의 메서드의 "다른 드로잉 명령"이후에 Paint 이벤트를 발생 시키려면 어떻게해야합니까? – mbeckish

+0

@mbeckish 자신의 드로잉 후에 기본 메서드를 쉽게 호출 할 수 있지만 그 결과는 컨트롤의 유형과 OnPaint 메서드에서 수행하는 작업에 따라 달라집니다. 컨트롤은 방금 그린 것 위에 페인트 칠 수 있다는 것을 알고 있어야합니다. 원하면 배경을 지우는 것이'OnPaint' 메쏘드에서 일어나지 않고'OnPaintBackground' 메쏘드에서 일어납니다. –

3

메서드는 Paint 이벤트를 발생 시키므로 Form1_Paint 메서드는 base.OnPaint이라고합니다. 무한 루프가 발생하고 결국 StackOverflowException이됩니다.

올바른 것은 OnPaint 메소드를 오버라이드 (override)하는 것입니다 :

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    //custom painting here... 
} 

더 많은 정보를 원하시면,이 MSDN link를 참조하십시오.

2

위의 코드에서 OnPaint 메서드를 재정의하지 않고 실제로는 페인트 이벤트를 처리하고 있고, 물론 처리기 안에 다시 페인트하려고하면 무한 루프가 발생합니다.