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

Joh*_*n V 8 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

假设"body"是空的 - 如果我删除DrawChar中的条件,程序从不绘制任何东西,我发现onPaint甚至不再被提升(例如,当调整大小或缩小和恢复窗口时).

编辑:重点是 - 如果DrawImage失败(你不知道调试器,它只是不绘制图像,例如当Image为null)时,应用程序中的OnPaint事件不再被引发.

Han*_*ant 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.
Run Code Online (Sandbox Code Playgroud)

破折号用于拼写f-word,在开源之前对源代码进行消毒需要花费很长时间,当他们尝试自动化时会造成相当大的损害:)