如果一個窗口由于某種原因(例如,窗口從被遮蓋狀态變為顯示狀态)需要重新繪制,但是窗口所屬的線程來不及處理窗口重繪消息,這個時候,Windows會使用白色來繪制這個窗口,或者,至少我們會收到用戶關于這種問題的反饋(他們會說窗口有一瞬間變成了白色)。
實際上,Windows隻是會使用窗口類裡指定的背景畫刷來繪制窗口而已。因為大多數開發者使用COLOR_WINDOW這個顔色值,而COLOR_WINDOW在大部分的顔色配置系統中是白色的,所以,用戶最終看到的結果是:Windows使用白色來繪制窗口。
為什麼Windows要這樣設計呢?有人會問了:”為什麼要多次一舉再重繪一次呢?直接不管它就不就完了?”的确,我們之前也是采用”什麼都不做”的方案,但是這個方案的結果是:窗口會顯示凍結之前的畫面。
假設有這種場景:用戶正在使用資源管理器,當他嘗試恢複一個應用程序窗口時這個窗口恰巧挂起了。這個時候,如果采用”什麼都不做”的方案,則他會看到,窗口的主界面會顯示資源管理器的畫面,用戶有可能以為是資源管理器卡住了,實際上,是應用程序卡住了。當他在這個界面點擊鼠标的時候,實際上是點擊的卡住後的應用程序。
在Windows XP中,對未響應的窗口執行繪制的方法有點不一樣。現在,系統會捕獲窗口中未響應的那一部分區域,并嘗試繪制它。但是,如果系統不能捕獲到所有的窗口區域,比如,窗口的部分區域被覆蓋了,則這部分區域會使用窗口類的背景畫刷來進行繪制。
這就是你為什麼看到一個白色窗口閃爍的原因。
總結如果希望制作一個”絲滑”的用戶界面,要小心謹慎的處理好界面主線程和工作線程的關系,一旦主線程中的代碼執行時間過長,則窗口就有卡住的可能,用戶就會開始抱怨了:好卡!
最後Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關于Windows的小知識,對于廣大Windows平台開發者來說,确實十分有幫助。本文來自:《The white flash》
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!