为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
茅侃侃 2021-11-28 16:37:22
我发现了一些我没有真正得到的东西: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 事件将停止引发。
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

好像失败的 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,在开源之前清理源代码花了很长时间,并在他们尝试自动化时造成了相当大的损害:)


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 241 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信