CREATION DE SURFACE


Une surface sous DirectDraw est une zone rectangulaire servant à stocker des images. Elles servent aussi à stocker des bitmaps et à la représentation de l'écran video

CreateSurface
CreateClipper


HRESULT CreateSurface(
LPDDSURFACEDESC2 lpDDSurfaceDesc2,
LPDIRECTDRAWSURFACE7 FAR *lplpDDSurface,
IUnknown FAR *pUnkOuter
);

Type Description Valeur
lpDDSurfaceDesc2 Pointeur sur une structure DDSURFACEDESC2 contenant la description de la surface
lplpDDSurface Adresse d'une variable destinée à recevoir un pointeur vers une interface IDIRECTDRAWSURFACE7
pUnkOuter Réservé (doit etre a 0) 0=valeur obligatoire

En cas de succés, la fonction renvoie la valeur DD_OK.

Le clipper est utilisé afin d'éviter les debordements et les sorties de surface.

HRESULT CreateClipper(
DWORD dwFlags,
LPDIRECTDRAWCLIPPER FAR *lplpDDClipper,
IUnknown FAR *pUnkOuter
);

Type Description Valeur
dwFlags Non utilisé. Doit être à zéro. 0=Valeur obligatoire.
lplpDDClipper Adresse d'une variable servant à recevoir un pointeur IDirectDrawClipper
pUnkOuter Réservé. Doit être à zéro. 0=Valeur obligatoire.

En cas de succés, la fonction renvoie la valeur DD_OK.

Un exemple (celui de boulder):

//Creation du clipper

hRet = lpDD->CreateClipper(NULL,&lpClip,NULL);
if (hRet != DD_OK)
{
MessageBox(NULL,"Erreur clipper","Boulder",MB_OK);
return FALSE;
}

// Creation de la surface primaire + backbuffer

lpClip->SetHWnd(0,hWnd); //note: le pointeur hWnd sera obtenu lors de la creation de la fenêtre de l'application.

ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1; hRet = lpDD->CreateSurface( &ddsd, &FondEcran, NULL );
if (hRet!=DD_OK)
{
MessageBox(NULL,"Erreur création surface primaire","Boulder",MB_OK);
return FALSE;
}

//Dans cet exemple le code cree aussi un BackBuffer.

Remarques tres importantes:

Les 2 lignes suivantes sont très importantes:
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof( ddsd );

Il est imperatif d'initialiser la structure avec la 1er ligne et de definir la taille de la structure avec la 2ème. Si vous ne le faites pas vous risquez d'avoir des valeurs erronées et d'endomager la mémoire. Dans ce cas la seule chose à faire est le reboot !.