经过前面两篇文章的”洗礼”,我想,你应该知道了在何种情况下应该使用 LockWindowUpdate。
但接下来我要告诉你的是为什么不能使用它,即使是用于它本身的预期目的。
让我们回到古老的旧时代,那个时候,LockWindowUpdate 刚刚被创建出来。
在 16 位 Windows 年代,特别是 Windows 3.1 版本时期,内存是昂贵的。视频驱动程序的功能非常有限,当时还没有 DirectX,也没有 AlphaBlend 函数。
你所拥有的只是一个屏幕缓冲区。LockWindowUpdate 函数允许您控制该屏幕缓冲区的一个窗口部分,以便您可以在该窗口不知情的情况下将花哨的效果应用于该窗口。
自 Windows 3.1 以来已经十多年了,与此同时,我们获得了 DirectX 覆盖、区域窗口、分层窗口、Alpha 混合、桌面合成以及各种很酷的图形效果,这些都是过去不可用的。
特别是,这些分层窗口和区域窗口几乎可以让你做几乎所有你想用 LockWindowUpdate 做的事情。
如果要在窗口周围绘制高亮显示,可以在窗口周围放置一个区域窗口。如果要在窗口上绘制拖动图像,只需创建分层窗口并将其放置在目标窗口上即可。为分层窗口提供一个区域和您想要的任何花哨的 Alpha 通道,并让图形引擎完成 Alpha 混合和合成的繁重工作。更好的是,分层窗口可以延伸到您拖动的窗口之外,这是 LockWindowUpdate 无法做到的。
(如果您在资源管理器窗口中执行“全选”并在屏幕上拖动整个选择,则可以在 Windows XP 中看到此效果。请注意,拖动图像不受要拖动的窗口边界的约束。
更重要的是,在 Vista 桌面窗口管理器令人兴奋的新复合窗口的世界中,LockWindowUpdate 更是不可取。锁定特定窗口进行更新并不是那么糟糕,因为桌面窗口管理器可以为您提供窗口的支持位图。但是,如果您锁定整个屏幕(我见过人们可能会这样做),桌面窗口管理器需要将所有窗口组合成一个实际的位图,当您使用 DCX_LOCKWINDOWUPDATE 标志调用 GetDCEx 时,它可以为您提供该位图。
桌面窗口管理器在 DirectX 和加速视频驱动程序的帮助下即时进行合成。所有这些合成的结果通常直接进入屏幕,而实际上并不驻留在“复合”位图中。但是,如果您锁定屏幕并要求为其提供 DC,则桌面窗口管理器需要模拟旧行为,并允许您访问代表如果一开始就没有合成会得到的东西。这所带来的性能代价并不便宜。
总结
我不确定这个系列文章是否对你有帮助。我的目标只是帮助人们更有效地使用 LockWindowUpdate,并在 LockWindowUpdate 是不适合这项工作的工具时引导他们选择替代方案。
换句话说,这是一篇关于 LockWindowUpdate 的文章,而不是函数文档。我试图保持轻松的演讲,但我想我的笑话落空了,人们只是把它们当作负面评论的跳板。
特别感谢那些以此为契机抱怨文档的人。我的意思是,呃,如果文档是完美的,我一开始就不会写这个系列。尽管这些人也忽略了阅读所有文档;他们只查看了功能描述页面。
亲爱的开发者,文档不仅仅是枯燥的功能描述!功能说明仅供参考;当你已经知道发生了什么时,你就会去那里,你只需要微调一个细节。真正的学习发生在概述和文章中。如果您想学习如何操作收音机,请不要先阅读原理图。
我认为罗纳德·摩尔(Ronald D. Moore)说的: “你必须足够坚强才能听播客”,应该有着更深层次的含义。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Final remarks on LockWindowUpdate》