如果加载一次图片失败,为什么不再调用 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 为空时),应用程序中的 OnPaint 事件将停止引发。


茅侃侃
浏览 242回答 1
1回答

RISEBY

好像失败的 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-word,在开源之前清理源代码花了很长时间,并在他们尝试自动化时造成了相当大的损害:)
打开App,查看更多内容
随时随地看视频慕课网APP