我找到了一些我并不真正得到的东西:
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,在开源之前对源代码进行消毒需要花费很长时间,当他们尝试自动化时会造成相当大的损害:)