我发现了一些我没有真正得到的东西: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,在开源之前清理源代码花了很长时间,并在他们尝试自动化时造成了相当大的损害:)
- 1 回答
- 0 关注
- 241 浏览
添加回答
举报
0/150
提交
取消