IDirectDrawSurface7::Lock 方法 (ddraw.h)
获取指向表面内存的指针。
语法
HRESULT Lock(
[in] LPRECT unnamedParam1,
[in, out] LPDDSURFACEDESC2 unnamedParam2,
[in] DWORD unnamedParam3,
[in] HANDLE unnamedParam4
);
参数
[in] unnamedParam1
指向 RECT 结构的指针,该结构标识要锁定的图面的区域。 如果此参数为 NULL,则整个图面被锁定。
[in, out] unnamedParam2
指向 DDSURFACEDESC2 结构的指针,该结构描述有关图面的相关详细信息,并接收有关图面的信息。
[in] unnamedParam3
确定如何锁定表面的标志组合。 定义了以下标志:
DDLOCK_DONOTWAIT
在 IDirectDrawSurface7 接口上,默认值为 DDLOCK_WAIT。 如果要替代默认值并使用加速器正忙 (的时间(如DDERR_WASSTILLDRAWING返回值) 所示),请使用 DDLOCK_DONOTWAIT。
DDLOCK_EVENT
目前尚未实现。
DDLOCK_NOOVERWRITE
DirectX 7.0 的新增功能。 仅用于 Direct3D 顶点缓冲区锁。 指示在锁定期间,不会修改自帧开始 (或最后一个不带此标志) 锁以来在绘制操作中引用的顶点。 当只想将数据追加到顶点缓冲区时,这非常有用。
DDLOCK_NOSYSLOCK
请勿将 Win16Mutex (也称为 Win16Lock) 。 锁定主图面时会忽略此标志。
DDLOCK_DISCARDCONTENTS
DirectX 7.0 的新增功能。 仅用于 Direct3D 顶点缓冲区锁。 指示在此锁定期间未对顶点缓冲区的内容进行假设。 这使 Direct3D 或驱动程序能够提供替代的内存区域作为顶点缓冲区。 当您计划清除顶点缓冲区的内容并填充新数据时,这非常有用。
DDLOCK_OKTOSWAP
此标志已过时,已替换为DDLOCK_DISCARDCONTENTS标志。
DDLOCK_READONLY
指示要锁定的图面只能读取。
DDLOCK_SURFACEMEMORYPTR
指示应返回指向指定矩形顶部的有效内存指针。 如果未指定矩形,则返回指向图面顶部的指针。 这是默认值。
DDLOCK_WAIT
如果由于位块传输 (bitblt) 操作正在进行而无法获取锁,则 锁定 将重试,直到获得锁或发生其他错误(例如DDERR_SURFACEBUSY)。
DDLOCK_WRITEONLY
指示正在锁定的图面已启用写入。
[in] unnamedParam4
事件的句柄。 此参数当前未使用,必须设置为 NULL。
返回值
如果方法成功,则返回值DD_OK。
如果失败,方法可能会返回以下错误值之一:
- DDERR_INVALIDOBJECT
- DDERR_INVALIDPARAMS
- DDERR_OUTOFMEMORY
- DDERR_SURFACEBUSY
- DDERR_SURFACELOST
- DDERR_WASSTILLDRAWING
注解
在 IDirectDrawSurface7 中, Lock 的默认行为是等待加速器完成。 因此,在默认条件下, Lock 永远不会返回DDERR_WASSTILLDRAWING。 如果想要查看错误代码,而不是等到 bitblt 操作成功,请使用 DDLOCK_DONOTWAIT 标志。
检索 Surface 内存指针后,可以访问 Surface 内存,直到调用相应的 IDirectDrawSurface7::Unlock 方法。 当图面解锁时,指向表面内存的指针无效。
不要从图面的锁定区域调用 DirectDraw bitblt 函数。 如果这样做,则 bitblt 返回DDERR_SURFACEBUSY或DDERR_LOCKEDSURFACES。 在锁定的视频内存图面上使用时,GDI blit 函数也会无提示失败。
除非包含 DDLOCK_NOSYSLOCK 标志, 否则 Lock 会导致 DirectDraw 保留 Win16Mutex (也称为 Win16Lock) ,直到调用 IDirectDrawSurface7::Unlock 方法。 保留 Win16Mutex 时,GUI 调试器无法运行。
要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | ddraw.h |
Library | Ddraw.lib |
DLL | Ddraw.dll |