在之前的文章中,我们将了解了 LockWindowUpdate 应该在什么场景下使用,也就是拖动的场景。
今天,我们来看看 LockWindowUpdate 被误用的一些场景。
人们看到 LockWindowUpdate 的“您锁定的窗口将无法重新绘制自身”行为,并将其用作 WM_SETREDRAW 消息的一种懒惰版本。
尽管发送 WM_SETREDRAW 消息实际上并不比调用 LockWindowUpdate 难多少。键入的字符数增加了 20 个字符,如果在 中使用 SetWindowRedraw 宏,则为一半。
>> 请移步至 www.topomel.com 以查看图片 <<
正如我们之前提到的,一次只能锁定系统中的一个窗口进行更新。
如果你调用 LockWindowUpdate 的意图只是为了防止窗口重绘,例如,因为你正在更新它,并且不希望窗口在更新完成之前不断刷新,那么只需在该窗口上禁用重绘即可。
如果使用 LockWindowUpdate,则会产生一系列微妙的问题。
首先,如果其他程序以同样的方式滥用 LockWindowUpdate,那么你们中的一个将失败。谁先尝试 LockWindowUpdate,谁就会得到它,第二个程序就会失败。现在你该怎么办?您的窗口不再锁定。
其次,如果您已锁定窗口进行更新,并且用户切换到另一个程序并尝试拖动一个项目(甚至只是尝试移动窗口!),则该尝试将失败,并且用户现在处于拖放位置由于某种神秘原因而停止工作。然后,十秒钟后,它又开始工作了。“这 Windows 系统有 Bug 啊,”用户咕哝道。
相反,如果决定在进行拖放或窗口移动操作时调用 LockWindowUpdate,则调用将失败。这只是使用全局状态管理局部条件的更一般的编程错误的一个具体示例。
当您想在其中一个窗口中禁用重绘时,您不希望这影响系统中的其他窗口;这是当地的情况。但是你使用的是全局状态(锁定更新的窗口)来跟踪它。
我已经可以预料到人们会说,“好吧,如果某人不执行拖放操作,窗口管理器就不应该让他们锁定窗口进行更新。但是窗口管理器怎么知道呢?它知道发生了什么,但它不知道为什么。
该程序调用 LockWindowUpdate 是因为它懒得使用WM_SETREDRAW消息吗?或者它这样做是为了响应导致拖放操作的某些用户输入?
请注意,您不能只是说“好吧,鼠标按钮必须向下”,因为用户可能正在执行基于键盘的操作(例如使用箭头键调整窗口大小),该操作等同于拖放。
道德问题已经很难解决了,期望计算机能够推断出它着实有点苛刻。
总结
所以,如果不是为了实现拖放场景,请不是使用 LockWindowUpdate。
你大概率需要的是这个:SetRedraw。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《With what operations is LockWindowUpdate not meant to be used?》