我有用C#编写的MDI WinForms应用程序。通常,只有一种MDI子窗体可见,而所有其他子窗体都在后台。子表单的内容有时会在后台发生变化(例如,Web浏览器控件可能会显示每N秒动态变化的页面,图表控件会随着时间的流逝而充满数据)。
当用户将鼠标悬停在主窗体的工具栏上或单击特殊按钮时,我想显示子窗体的小预览。我可以成功使用here中所述的PrintWindow函数来制作子MDI表单的屏幕截图。这甚至适用于非活动子窗体。唯一的问题是,获取每个屏幕截图可能要花费大量时间(大约100-120毫秒),这可能是由于表单的复杂结构所致,因此,如果我在要显示预览之前制作屏幕截图,则会造成明显的延迟,尤其是在有很多子表单(例如10-15)时。
我想对此进行优化,并仅在确实需要时才重新创建屏幕截图。这就是我的意思。最初,我将为所有表单创建屏幕截图,将其存储在“缓存”中并显示预览。稍后,当我需要再次创建预览时,我想以某种方式确定MDI表单的可视内容已更改(或更改待定),仅在这种情况下才重新创建屏幕截图,否则使用“缓存的”屏幕截图。 / p>
我试图通过重写子窗体类的WndProc函数并查找一些消息(例如WM_PAINT或WM_SETREDRAW)来实现此目的。但是,当我记录所有消息时,即使该窗体处于活动状态(在前台),我也看不到WM_PAINT和WM_SETREDRAW,并且窗体上的Web浏览器控件不断更新其页面。那些事件可能直接发送到表单的控件,而不发送到表单本身。
我不想遍历每种表单并连接到所有控件的“已更改”事件,因为它们都非常不同,并且并非都具有此类通知事件。
我猜想每个控件要更改其视觉表示时都会向OS发送一些通知以强制自我重绘。 因此,有什么方法可以从MDI子窗体中的任何控件中检测到此类通知吗?
更新: 我发现WinAPI GetUpdateRect函数应该返回一个需要重绘的矩形。我以为如果返回非空矩形,则意味着屏幕快照需要更新。我尝试在调用PrintWindow之前先调用它,但是它总是返回空矩形。