屏幕一直滚动闪烁(窗口未响应时出现的白色闪烁)

问题

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

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

为什么Windows要这样设计呢?

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

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

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

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

总结

如果希望制作一个”丝滑”的用户界面,要小心谨慎的处理好界面主线程和工作线程的关系,一旦主线程中的代码执行时间过长,则窗口就有卡住的可能,用户就会开始抱怨了:好卡!

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。本文来自:《The white flash》

屏幕一直滚动闪烁(窗口未响应时出现的白色闪烁)(1)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页