在上一篇文章中,我们研究了应该使用 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?》