如果一次无法加载图片,为什么不再调用OnPaint?

时间:2018-08-14 15:33:19

标签: c# onpaint

我发现了我没有真正得到的东西:

protected override void OnPaint(PaintEventArgs e)
{
    DrawChar(e.Graphics);
    base.OnPaint(e);
}

void DrawChar(Graphics g)
{
    if (body != null)
    {
        g.DrawImage(body, X, Y);
    }
}

假设“主体”为空-如果我删除了DrawChar中的条件,该程序将永远不会绘制任何内容,并且我发现onPaint甚至不再凸起(例如,在调整大小或最小化并还原窗口时)。

编辑:关键是-如果DrawImage失败(您从调试器不知道,它根本不会绘制图像,例如,当Image为null时),则将停止引发应用程序中的OnPaint事件。 / p>

1 个答案:

答案 0 :(得分:14)

  

好像失败的DrawImage导致了某种错误状态

是的,这就是它的作用。 Paint事件处理程序中的异常非常尴尬,这使得继续调试程序变得很困难。如果不执行任何操作,则当您继续调试时,将一遍又一遍地引发这样的异常,这使得在程序中诊断另一个异常非常困难。 的关注日期可以追溯到Aero尚不存在的Win2000 / XP时代。

执行此操作的方法是调用OnPaint()的方法,它是一个名为Control.PaintWithErrorHandling()的内部方法。看看,您正确假设的错误状态称为STATE_EXCEPTIONWHILEPAINTING。设置一次后,它将始终退回到PaintException(),它绘制了失败的红十字会。这样避免了再次引发异常的风险。我将复制/粘贴评论:

    // Exceptions during painting are nasty, because paint events happen so often.
    // So if user painting code ----s up, we make sure never to call it again,
    // so as not to spam the end-user with exception dialogs.

破折号用来拼写f字,在开源之前清理源代码花费了一段时间,并在试图使它自动化时造成相当大的损害:)