我发现了我没有真正得到的东西:
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>
答案 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字,在开源之前清理源代码花费了一段时间,并在试图使它自动化时造成相当大的损害:)