我想知道在windows窗体程序中覆盖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,为什么?
答案 0 :(得分:7)
您没有覆盖OnPaint()
方法。您只是订阅Paint
个活动,因此不应致电base.OnPaint()
。
您应该(只能)在覆盖表单的base.OnPaint()
方法时调用OnPaint()
:
protected override OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// ... other drawing commands
}
Windows窗体控件上的OnPaint
方法实际上会引发控件的Paint
事件并绘制控件界面。通过在OnPaint
事件处理程序中调用基本表单的Paint
方法,您实际上是在告诉表单一次又一次地调用Paint
处理程序,因此您将陷入无限循环,因此StackOverflowException
。
当你覆盖控件的OnPaint
方法时,通常你应该调用基本方法,让控件自己绘制并调用订阅Paint
事件的事件处理程序。如果不调用基本方法,则不会绘制某些控件方面,也不会调用任何事件处理程序。
答案 1 :(得分: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 :(得分:2)
从上面的代码你没有覆盖OnPaint方法,你实际上是在处理paint事件,当然,如果你试图在处理程序中再次绘制它,你会得到一个无限循环。