zl程序教程

您现在的位置是:首页 >  前端

当前栏目

窗口未响应时出现的白色闪烁

响应 出现 窗口 闪烁 白色
2023-09-14 09:10:45 时间

问题

如果一个窗口由于某种原因(例如,窗口从被遮盖状态变为显示状态)需要重新绘制,但是窗口所属的线程来不及处理窗口重绘消息,这个时候,Windows会使用白色来绘制这个窗口,或者,至少我们会收到用户关于这种问题的反馈(他们会说窗口有一瞬间变成了白色)。

实际上,Windows只是会使用窗口类里指定的背景画刷来绘制窗口而已。因为大多数开发者使用COLOR_WINDOW这个颜色值,而COLOR_WINDOW在大部分的颜色配置系统中是白色的,所以,用户最终看到的结果是:Windows使用白色来绘制窗口。

为什么Windows要这样设计呢?

有人会问了:”为什么要多次一举再重绘一次呢?直接不管它就不就完了?”
的确,我们之前也是采用”什么都不做”的方案,但是这个方案的结果是:窗口会显示冻结之前的画面。

假设有这种场景:用户正在使用资源管理器,当他尝试恢复一个应用程序窗口时这个窗口恰巧挂起了。这个时候,如果采用”什么都不做”的方案,则他会看到,窗口的主界面会显示资源管理器的画面,用户有可能以为是资源管理器卡住了,实际上,是应用程序卡住了。当他在这个界面点击鼠标的时候,实际上是点击的卡住后的应用程序。

在Windows XP中,对未响应的窗口执行绘制的方法有点不一样。现在,系统会捕获窗口中未响应的那一部分区域,并尝试绘制它。但是,如果系统不能捕获到所有的窗口区域,比如,窗口的部分区域被覆盖了,则这部分区域会使用窗口类的背景画刷来进行绘制。

这就是你为什么看到一个白色窗口闪烁的原因。

总结

如果希望制作一个”丝滑”的用户界面,要