Поделиться через


Метод IDirectDrawSurface7::Lock (ddraw.h)

Получает указатель на память surface.

Синтаксис

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 по умолчанию блокировка ожидает завершения работы ускорителя. Поэтому в условиях по умолчанию блокировка никогда не возвращает DDERR_WASSTILLDRAWING. Если вы хотите просмотреть коды ошибок и не ждать завершения операции bitblt, используйте флаг DDLOCK_DONOTWAIT.

После получения указателя памяти surface вы можете получить доступ к памяти surface, пока не будет вызван соответствующий метод IDirectDrawSurface7::Unlock . При разблокировке поверхности указатель на память surface становится недопустимым.

Не вызывайте функции bitblt DirectDraw для bitblt из заблокированной области поверхности. В этом случае bitblt возвращает либо DDERR_SURFACEBUSY, либо DDERR_LOCKEDSURFACES. Функции GDI blit также автоматически завершаются сбоем при использовании на заблокированной поверхности видеопамять.

Если вы не включили флаг DDLOCK_NOSYSLOCK, блокировка приведет к тому, что DirectDraw будет удерживать Win16Mutex (также известный как Win16Lock), пока вы не вызовете метод IDirectDrawSurface7::Unlock . Отладчики графического пользовательского интерфейса не могут работать, пока находится Win16Mutex.

Требования

Требование Значение
Целевая платформа Windows
Header ddraw.h
Библиотека Ddraw.lib
DLL Ddraw.dll

См. также раздел

IDirectDrawSurface7