BOOL LockWindowUpdate(HWND hWndLock)

一、函数行为是什么?
    LockWindowUpdate 同一时间只锁定一个窗口,当一个窗口被“锁定”,所有向它及其子窗口的绘制都会失败。取代绘制操作的是,窗口管理器记住了应用程序试图在窗口的哪一部分中进行绘制。当窗口“解锁”后,这些区域被无效化,使得应用程序得到一个WM_PAINT消息,从而重新恢复了屏幕内容与应用程序认为应当在屏幕上显示的内容之间的同步。
二、打算如何使用?
    事实上,LockWindowUpdate的设计意图可以用一个词表达:拖拽。但我们稍后再说到这个。 
    LockWindowUpdate的目的是允许一个程序暂时接管窗口的绘制工作。为了做到这个,你当然需要防止窗口函数(或其它任何人)进行他们正常的绘制活动;否则,两处的代码(正常绘制窗口的代码和试图接管绘制的代码)会互相争夺对窗口的控制,由于互不知道对方在做什么,最后得到的将是一团糟。
    但是,如果你已经锁定了窗口的更新,那么如何才能在窗口上绘制呢?你可以在GetDCEx函数中使用DCX_LOCKWINDOWUPDATE标志。这个标志表示“即便是窗口已经锁定,也让我绘制到上面”。当然了,只有锁定了这个窗口的代码才能传递这个标志,否则又会引发LockWindowUpdate起初试图解决的那类冲突。  
    换句话说,当一个窗口更新被锁定后,普通的DC获取函数(BeginPaint及其伙伴)向窗口上绘制的能力将被剥夺,被赋于给了GetDCEx(DCX_LOCKWINDOWUPDATE)。注意,如果没有窗口被锁定更新,不要使用DCX_LOCKWINDOWUPDATE标志,这个标志的目的是指出“我就是那个调用了LockWindowUpdate的家伙,快放行!”
 
如果回头看一下LockWindowUpdate函数的工作方式,你会发现如果一个锁定的窗口没有试图做任何绘制,那么当窗口解锁时,不会有区域被无效。尽管CS_SAVEBITS窗口类属性会在窗口从屏幕上移除时自动保存原始的象素,并自动还原这些象素,LockWindowUpdate不会做任何类似的事。你需要自己负起责任确保在窗口被锁定更新时你修改的象素,在调用LockWindowUpdate(NULL)后恢复到原始的值。这通常可以通过在做自己的绘图操作前,将原始象素保存到一个屏幕外的位图中,并在完成后将它们绘制回去。
 
好,那么下面这就是意图的使用方式:
 
当你想接管另一个窗口的绘制,对那个窗口调用LockWindowUpdate。
保存你将要覆盖绘制的窗口的象素。
绘制新的象素(这些象素往往是原始象素的修正,比如在将一个对象拖动到一个窗口上方时,你可能会添加一个表示此对象的图片)。
只要你的操作还在进行中,尽管重复。(这么做时,如果你正修改的屏幕区域与之前修改的不同,可能需要“备份”更多的屏幕上的象素。你可以增量的做备份/还原。例如,你不必在绘制新图片前累计需要恢复的象素集,只需要先把保存的所有象素恢复到屏幕,然后计算拖动图片的新位置,保存新位置处的象素,接着就可以在新位置绘制新图片。通过这种方式,你只需要处理一组“备份象素”)
当操作完成,恢复原始象素,并调用LockWindowUpdate(NULL)。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/BalonFan/archive/2007/05/04/1595805.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值