Metodo IDirectDrawSurface7::Lock (ddraw.h)
Ottiene un puntatore alla memoria superficiale.
Sintassi
HRESULT Lock(
[in] LPRECT unnamedParam1,
[in, out] LPDDSURFACEDESC2 unnamedParam2,
[in] DWORD unnamedParam3,
[in] HANDLE unnamedParam4
);
Parametri
[in] unnamedParam1
Puntatore a una struttura RECT che identifica l'area della superficie bloccata. Se questo parametro è NULL, l'intera superficie è bloccata.
[in, out] unnamedParam2
Puntatore a una struttura DDSURFACEDESC2 che descrive i dettagli rilevanti sulla superficie e che riceve informazioni sulla superficie.
[in] unnamedParam3
Combinazione di flag che determinano come bloccare la superficie. Vengono definiti i flag seguenti:
DDLOCK_DONOTWAIT
Nelle interfacce IDirectDrawSurface7 il valore predefinito è DDLOCK_WAIT. Se si vuole eseguire l'override del valore predefinito e usare il tempo in cui l'acceleratore è occupato (come indicato dal valore restituito DDERR_WASSTILLDRAWING), usare DDLOCK_DONOTWAIT.
DDLOCK_EVENT
Non implementato attualmente.
DDLOCK_NOOVERWRITE
Novità per DirectX 7.0. Usato solo con blocchi del vertex buffer Direct3D. Indica che nessun vertice a cui viene fatto riferimento in un'operazione di disegno dall'inizio del frame (o dall'ultimo blocco senza questo flag) viene modificato durante il blocco. Ciò può essere utile quando si desidera aggiungere dati solo al vertex buffer.
DDLOCK_NOSYSLOCK
Non prendere Win16Mutex (noto anche come Win16Lock). Questo flag viene ignorato quando si blocca la superficie primaria.
DDLOCK_DISCARDCONTENTS
Novità per DirectX 7.0. Usato solo con blocchi del vertex buffer Direct3D. Indica che non vengono effettuate ipotesi sul contenuto del buffer dei vertici durante questo blocco. In questo modo Direct3D o il driver possono fornire un'area di memoria alternativa come vertex buffer. Ciò è utile quando si prevede di cancellare il contenuto del vertex buffer e di compilare nuovi dati.
DDLOCK_OKTOSWAP
Questo flag è obsoleto ed è stato sostituito dal flag DDLOCK_DISCARDCONTENTS.
DDLOCK_READONLY
Indica che la superficie bloccata può essere di sola lettura.
DDLOCK_SURFACEMEMORYPTR
Indica che deve essere restituito un puntatore di memoria valido all'inizio del rettangolo specificato. Se non viene specificato alcun rettangolo, viene restituito un puntatore alla parte superiore della superficie. Questo è il valore predefinito.
DDLOCK_WAIT
Se non è possibile ottenere un blocco perché è in corso un'operazione bit block transfer (bitblt), i tentativi di blocco fino a quando non viene ottenuto un blocco o si verifica un altro errore, ad esempio DDERR_SURFACEBUSY.
DDLOCK_WRITEONLY
Indica che la superficie bloccata è abilitata per la scrittura.
[in] unnamedParam4
Handle dell'evento. Questo parametro non è attualmente utilizzato e deve essere impostato su NULL.
Valore restituito
Se il metodo ha esito positivo, il valore restituito viene DD_OK.
Se ha esito negativo, il metodo può restituire uno dei valori di errore seguenti:
- DDERR_INVALIDOBJECT
- DDERR_INVALIDPARAMS
- DDERR_OUTOFMEMORY
- DDERR_SURFACEBUSY
- DDERR_SURFACELOST
- DDERR_WASSTILLDRAWING
Commenti
In IDirectDrawSurface7 il comportamento predefinito di Lock deve attendere il completamento dell'acceleratore. Pertanto, in condizioni predefinite, Lock non restituisce mai DDERR_WASSTILLDRAWING. Se si desidera visualizzare i codici di errore e non attendere che l'operazione bitblt abbia esito positivo, usare il flag DDLOCK_DONOTWAIT.
Dopo aver recuperato un puntatore alla memoria della superficie, è possibile accedere alla memoria della superficie fino a quando non viene chiamato un metodo IDirectDrawSurface7::Unlock corrispondente. Quando la superficie viene sbloccata, il puntatore alla memoria della superficie non è valido.
Non chiamare le funzioni bitblt directDraw in bitblt da un'area bloccata di una superficie. In tal caso, bitblt restituisce DDERR_SURFACEBUSY o DDERR_LOCKEDSURFACES. Anche le funzioni di blit GDI hanno esito negativo in modo invisibile all'utente quando vengono usate su una superficie di memoria video bloccata.
A meno che non includa il flag DDLOCK_NOSYSLOCK, Lock fa sì che DirectDraw contenga Win16Mutex (noto anche come Win16Lock) fino a quando non chiami il metodo IDirectDrawSurface7::Unlock . I debugger GUI non possono funzionare mentre win16Mutex è mantenuto.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Windows |
Intestazione | ddraw.h |
Libreria | Ddraw.lib |
DLL | Ddraw.dll |