在上一篇文章中,我們研究了應該使用 lockwindowupdate 的場景,即拖動場景。
今天,我們將看一下 lockwindowupdate 被濫用的一些場景。
人們看到 LockWindowUpdate 的“鎖定的視窗將無法重新繪製自身”行為,並將其用作 WM SetRedraw 訊息的懶惰版本。
儘管傳送 WM setredraw 訊息實際上並不比呼叫 lockwindowupdate 難多少。 鍵入的字元數將增加 20 個字元,如果在 中使用 setwindowredraw 巨集,則增加一半。
正如我們前面提到的,一次只能鎖定系統中的乙個視窗進行更新。
例如,如果呼叫 lockwindowupdate 的目的是防止視窗重繪,因為您正在更新視窗,並且不希望視窗在更新完成之前保持重新整理,則只需在該視窗上禁用重繪即可。
如果使用 LockWindowUpdate,則會建立一系列微妙的問題。
首先,如果其他程式以同樣的方式濫用 LockWindowUpdate,那麼其中乙個程式將失敗。 誰先嘗試 lockwindowupdate,誰就會得到它,第二個程式就會失敗。 現在你該怎麼辦?您的視窗不再鎖定。
其次,如果您已鎖定視窗進行更新,並且使用者切換到另乙個程式並嘗試拖動專案(甚至只是嘗試移動視窗!),嘗試將失敗,並且使用者現在處於拖放位置,由於某種神秘原因而停止工作。然後,十秒鐘後,它又開始工作了。 “這個 Windows 系統有乙個錯誤,”使用者咕噥道。
相反,如果決定在執行拖放或視窗移動操作時呼叫 lockwindowupdate,則呼叫將失敗。 這只是乙個更通用的程式設計錯誤的具體示例,該錯誤使用全域性狀態來管理本地條件。
當您想在其中乙個視窗中禁用重繪時,您不希望這影響系統中的其他視窗;這就是當地的情況。 但是,您使用的是全域性狀態(鎖定更新的視窗)來跟蹤它。
我已經可以預期人們會說,“好吧,如果有人不進行拖放,視窗管理器不應該讓他們鎖定視窗進行更新。 但是視窗管理器怎麼知道呢?它知道發生了什麼,但它不知道為什麼。
程式呼叫 lockwindowupdate 是因為它懶得使用 WM setredraw 訊息嗎?或者它這樣做是為了響應導致拖放操作的某些使用者輸入?
請注意,您不能只說“好吧,滑鼠按鈕必須向下”,因為使用者可能正在執行基於鍵盤的操作,例如使用箭頭鍵調整視窗大小,這相當於拖放。
道德問題很難解決,期望計算機能夠推斷出這個問題有點苛刻。
總結。 因此,如果不適用於拖放方案,請不要使用 LockWindowUpdate。 你很有可能需要這個:setredraw。
最後。 Raymond Chen 的“The Old New Thing”是我最喜歡的部落格之一,它有很多關於 Windows 的小知識,這對 Windows 開發人員真的很有幫助。 **with what operations is lockwindowupdate not meant to be used?》