2012-02-11 98 views
4

我想知道什麼時候應該調用base.OnPaint,當我們重寫OnPaint在Windows窗體程序中?什麼時候應該調用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()
你應該(可能)只調用base.OnPaint()當您覆蓋形式的OnPaint()方法:

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

    // ... other drawing commands 
} 

OnPaint方法在Windows窗體控件實際上提高了Paint事件的控制,也借鑑了控制面。通過調用Paint事件處理程序中的基本表單OnPaint方法,您實際上是在告訴表單一次又一次調用Paint處理函數,因此您將陷入無限循環,因此將陷入StackOverflowException

當您覆蓋控件的OnPaint方法時,通常應該調用基本方法,讓控件繪製自己並調用訂閱Paint事件的事件處理程序。如果您不調用基本方法,則不會繪製某些控件方面,也不會調用任何事件處理函數。

+0

如果您希望在重寫方法的「其他繪圖命令」之後引發Paint事件,該怎麼辦? – mbeckish 2013-01-18 18:43:09

+0

@mbeckish你可以在你自己的圖紙之後輕鬆調用base方法,但是結果取決於控件的類型以及它在OnPaint方法中的作用。你應該知道,控制可以繪製你剛剛繪製的內容。希望擦除背景不會發生在'OnPaint'方法中,而是'OnPaintBackground'方法中。 – 2013-01-19 06:19:21

3

base.OnPaint(e)方法引發Paint事件,因此您的Form1_Paint方法在base.OnPaint內部調用。這導致無限循環並最終導致StackOverflowException

正確的做法是重寫OnPaint方法:

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

欲瞭解更多信息,請參閱本MSDN link

2

從上面的代碼你不覆蓋OnPaint方法,你實際上正在處理繪製事件,當然,如果你試圖在處理程序中再次繪製它,你會得到一個無限循環。

相關問題