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

 
现在我们知道了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的概念绑定在一起的。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值