为什么OnPaint加载一次图片失败就不再调用了?
Why OnPaint is not called anymore if it fails to load a picture once?
我发现了一些我没有真正理解的东西:
protected override void OnPaint(PaintEventArgs e)
{
DrawChar(e.Graphics);
base.OnPaint(e);
}
void DrawChar(Graphics g)
{
if (body != null)
{
g.DrawImage(body, X, Y);
}
}
假设 "body" 为空 - 如果我删除 DrawChar 中的条件,程序将不再绘制任何东西,我发现 onPaint 甚至不再被触发(例如,当调整大小时或最小化和恢复window)。
编辑:重点是 - 如果 DrawImage 失败(您从调试器中不知道,它根本不绘制图像,例如当 Image 为 null 时),应用程序中的 OnPaint 事件将停止引发.
As if the failed DrawImage caused some error state
是的,这正是它的作用。 Paint 事件处理程序中的异常非常尴尬,它使继续调试程序变得困难。如果什么都不做,当你继续调试时,这样的异常会一遍又一遍地抛出,导致很难诊断程序中的另一个异常。这个问题 是 过时的,可以追溯到 Aero 还不存在的 Win2000/XP 天。
执行此操作的方法是调用 OnPaint() 的方法,它是一个名为 Control.PaintWithErrorHandling() 的内部方法。看一看,你正确假设的错误状态被命名为STATE_EXCEPTIONWHILEPAINTING。当它被设置一次时,它总是回退到 PaintException(),它绘制失败的红十字。从而避免再次引发异常的风险。我会 copy/paste 评论:
// 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 的破折号,在开源之前清理源代码花了很长时间,并且在他们试图自动化时造成了相当大的损害:)
我发现了一些我没有真正理解的东西:
protected override void OnPaint(PaintEventArgs e)
{
DrawChar(e.Graphics);
base.OnPaint(e);
}
void DrawChar(Graphics g)
{
if (body != null)
{
g.DrawImage(body, X, Y);
}
}
假设 "body" 为空 - 如果我删除 DrawChar 中的条件,程序将不再绘制任何东西,我发现 onPaint 甚至不再被触发(例如,当调整大小时或最小化和恢复window)。
编辑:重点是 - 如果 DrawImage 失败(您从调试器中不知道,它根本不绘制图像,例如当 Image 为 null 时),应用程序中的 OnPaint 事件将停止引发.
As if the failed DrawImage caused some error state
是的,这正是它的作用。 Paint 事件处理程序中的异常非常尴尬,它使继续调试程序变得困难。如果什么都不做,当你继续调试时,这样的异常会一遍又一遍地抛出,导致很难诊断程序中的另一个异常。这个问题 是 过时的,可以追溯到 Aero 还不存在的 Win2000/XP 天。
执行此操作的方法是调用 OnPaint() 的方法,它是一个名为 Control.PaintWithErrorHandling() 的内部方法。看一看,你正确假设的错误状态被命名为STATE_EXCEPTIONWHILEPAINTING。当它被设置一次时,它总是回退到 PaintException(),它绘制失败的红十字。从而避免再次引发异常的风险。我会 copy/paste 评论:
// 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 的破折号,在开源之前清理源代码花了很长时间,并且在他们试图自动化时造成了相当大的损害:)