LockWindowUpdate系列2:LockWindowUpdate是打算如何使用的?

来源:互联网 发布:.cn域名续费一年多少钱 编辑:程序博客网 时间:2024/04/30 02:00
 
现在我们知道了LockWindowUpdate的行为。现在我们来看一下它是用于做什么的。
 
事实上,LockWindowUpdate的设计意图可以用一个词表达:拖拽。但我们稍后再说到这个。
 
LockWindowUpdate的目的是允许一个程序暂时的接管绘制窗口的工作。为了做到这个,你当然需要防止窗口函数(或其它任何人)进行他们正常的绘制活动;否则,两处的代码(正常绘制窗口的代码和试图接管绘制的代码)会互相争夺对窗口的控制,由于互不知道对方在做什么,最后得到的将是一团糟。
 
但是,如果你已经锁定了窗口的更新,那么如何才能在窗口上绘制呢?你可以在GetDCEx函数中使用DCX_LOCKWINDOWUPDATE标志。这个标志表示“即便是窗口已经锁定,也让我绘制到上面”。当然了,只有锁定了这个窗口的代码才能传递这个标志,否则又会引发LockWindowUpdate起初试图解决的那类冲突。
 
由于人们都很喜欢看表格,我制作了一个表格总结了当一个窗口被锁定更新时发生了什么变化。
 
正常行为
更新被锁定
BeginPaint, GetDC,等等…
绘制操作绘制到窗口上
绘制操作没有在窗口上绘出任何东西,但影响的区域被记录下来以供后面无效化
带DCX_LOCKWINDOWUPDATE标志的GetDCEx
(不要使用)
绘制操作绘制到窗口上
  
换句话说,当一个窗口更新被锁定后,普通的DC获取函数(BeginPaint及其伙伴)向窗口上绘制的能力将被剥夺,赋于了GetDCEx(DCX_LOCKWINDOWUPDATE)。注意,如果没有窗口被锁定更新,不要使用DCX_LOCKWINDOWUPDATE标志,这个标志的目的是指出“我就是那个调用了LockWindowUpdate的家伙,快放行!”
 
窗口管理器有几分像喜剧中的情节。你告诉守卫说“不许任何人进入这个房间。”一小时后你回来了,守卫不让你进去。
“对不起先生,我不能让任何人进这个房间。”
“但我就是那个告诉你不让任何人进去的人呀。”
“是的,先生,我是按照您的指示做的。任何人都不能进入这个房间。” 
错误在于最初给守卫下达的命令。你应当说:“除了我以外,任何人都不允许进入这个房间。” DCX_LOCKWINDOWUPDATE就好比你对窗口管理器说:“是我,让我进去。”
 
如果回头看一下LockWindowUpdate函数的工作方式,你会发现如果一个锁定的窗口没有试图做任何绘制,那么当窗口解锁时,不会有区域被无效。尽管CS_SAVEBITS窗口类属性会在窗口从屏幕上移除时自动保存原始的象素,并自动还原这些象素,LockWindowUpdate不会做任何类似的事。你需要自己负起责任确保在窗口被锁定更新时你修改的象素,在调用LockWindowUpdate(NULL)后恢复到原始的值。这通常可以通过在做自己的绘图操作前,将原始象素保存到一个屏幕外的位图中,并在完成后将它们绘制回去。
 
好,那么下面这就是意图的使用方式:
 
  • 当你想接管另一个窗口的绘制,对那个窗口调用LockWindowUpdate。
  • 保存你将要覆盖绘制的窗口的象素。
  • 绘制新的象素(这些象素往往是原始象素的修正,比如在将一个对象拖动到一个窗口上方时,你可能会添加一个表示此对象的图片)。
  • 只要你的操作还在进行中,尽管重复。(这么做时,如果你正修改的屏幕区域与之前修改的不同,可能需要“备份”更多的屏幕上的象素。你可以增量的做备份/还原。例如,你不必在绘制新图片前累计需要恢复的象素集,只需要先把保存的所有象素恢复到屏幕,然后计算拖动图片的新位置,保存新位置处的象素,接着就可以在新位置绘制新图片。通过这种方式,你只需要处理一组“备份象素”)
  • 当操作完成,恢复原始象素,并调用LockWindowUpdate(NULL)。

 

下一篇,我们将看到“拖拽”这个词的更多内容,以其是如何紧密的与整个LockWindowUpdate的概念绑定在一起的。
 
尽管我们才刚刚开始讨论LockWindowUpdate,你应当已经足以回管这个问题
 
(注意:写这个系列的目的在于描述LockWindowUpdate的意图使用方式,不是讨论这首先是不是一个好的设计)

 

LockWindowUpdate系列1:LockWindowUpdate的行为?

LockWindowUpdate系列2:LockWindowUpdate是打算如何使用的?

LockWindowUpdate系列3:什么样的操作中应当使用LockWindowUpdate?

LockWindowUpdate系列4:什么样的操作中不应当使用LockWindowUpdate?

LockWindowUpdate系列5:关于LockWindowUpdate的最终评论

 

 
原文出处:http://blogs.msdn.com/oldnewthing/archive/2007/02/20/1726880.aspx