如果一个窗口由于某种原因(例如,窗口从被遮盖状态变为显示状态)需要重新绘制,但是窗口所属的线程来不及处理窗口重绘消息,这个时候,Windows会使用白色来绘制这个窗口,或者,至少我们会收到用户关于这种问题的反馈(他们会说窗口有一瞬间变成了白色)。
实际上,Windows只是会使用窗口类里指定的背景画刷来绘制窗口而已。因为大多数开发者使用COLOR_WINDOW这个颜色值,而COLOR_WINDOW在大部分的颜色配置系统中是白色的,所以,用户最终看到的结果是:Windows使用白色来绘制窗口。
为什么Windows要这样设计呢?有人会问了:”为什么要多次一举再重绘一次呢?直接不管它就不就完了?”
的确,我们之前也是采用”什么都不做”的方案,但是这个方案的结果是:窗口会显示冻结之前的画面。
假设有这种场景:用户正在使用资源管理器,当他尝试恢复一个应用程序窗口时这个窗口恰巧挂起了。这个时候,如果采用”什么都不做”的方案,则他会看到,窗口的主界面会显示资源管理器的画面,用户有可能以为是资源管理器卡住了,实际上,是应用程序卡住了。当他在这个界面点击鼠标的时候,实际上是点击的卡住后的应用程序。
在Windows 电脑XP中,对未响应的窗口执行绘制的方法有点不一样。现在,系统会捕获窗口中未响应的那一部分区域,并尝试绘制它。但是,如果系统不能捕获到所有的窗口区域,比如,窗口的部分区域被覆盖了,则这部分区域会使用窗口类的背景画刷来进行绘制。
这就是你为什么看到一个白色窗口闪烁的原因。
总结如果希望制作一个”丝滑”的用户界面,要小心谨慎的处理好界面主线程和工作线程的关系,一旦主线程中的代码执行时间过长,则窗口就有卡住的可能,用户就会开始抱怨了:好卡!
最后电脑Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The white flash》
电脑