Bonjour,
J'aimerais afficher plusieurs images les unes à la suite des autres avec DirectDraw 7, mais je rencontre quelques problèmes. pouvez vous m'aidez ?
Voici d'abord mon code source :
Voici la fonction ChargeBitmap :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 //Création de la surface primaire et son backbuffer LPDIRECTDRAWSURFACE7 primsurf; // surface primaire DDSURFACEDESC2 desc; // Description de la surface ZeroMemory(&desc, sizeof(desc)); // initialisation : remplissage avec des 0 desc.dwSize = sizeof(desc); desc.dwFlags = DDSD_BACKBUFFERCOUNT | DDSD_CAPS; desc.dwBackBufferCount = 1; desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; TRY_ERR_DD(lpDD->CreateSurface(&desc, &primsurf,0)) //Création de la surface backbuffer à partir de la surface primaire LPDIRECTDRAWSURFACE7 backsurf; DDSCAPS2 ddscaps; ZeroMemory(&ddscaps, sizeof(ddscaps)); ddscaps.dwCaps = DDSCAPS_BACKBUFFER | DDSCAPS_FLIP | DDSCAPS_COMPLEX; primsurf->GetAttachedSurface(&ddscaps, &backsurf); LPDIRECTDRAWSURFACE7 bmpTron = ChargeBitmap("TRON", RGB(0,0,0)); LPDIRECTDRAWSURFACE7 bmpLaby = ChargeBitmap("LABY", RGB(0,0,0)); RECT rect = {0,0,EcranX,EcranY}; backsurf->BltFast(0, 0, bmpTron, &rect, DDBLTFAST_NOCOLORKEY); //Copie de l'image dans le backbuffer //Inverser la surface primaire et son backbuffer primsurf->Flip(NULL, DDFLIP_WAIT); Sleep(2000); [b]primsurf->Flip(NULL, DDFLIP_WAIT); // ligne importante[/b] backsurf->BltFast(0, 0, bmpLaby, &rect, DDBLTFAST_NOCOLORKEY); //Copie de l'image dans le backbuffer //Inverser la surface primaire et son backbuffer primsurf->Flip(NULL, DDFLIP_WAIT);
Vous voyez la ligne en gras ? sans cette ligne, la deuxième image ne s'affiche pas. Est on obliger de ré-inverser les deux surfaces ? est ce une opération couteuse en mémoire ? (il y a recopie à chaque fois, non ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 // retourne le pointeur sur la surface contenant l'image LPDIRECTDRAWSURFACE7 ChargeBitmap(LPCTSTR Fichier, COLORREF ColorTransparent) { HBITMAP hbm; // handle pour une bitmap LPDIRECTDRAWSURFACE7 Image; // surface (texture pour >dx8) //Récupére le Handle de l'image if((hbm = (HBITMAP)LoadImage((HINSTANCE)GetModuleHandle(NULL), Fichier, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION)) != NULL) { BITMAP Info; GetObject(hbm, sizeof(Info), &Info); //Récupére les dimensions de l'image //Création de la surface DDSURFACEDESC2 ddsd; ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = Info.bmWidth; ddsd.dwHeight = Info.bmHeight; TRY_ERR_DD(lpDD->CreateSurface(&ddsd, &Image, NULL)) //Copie de l'image dans la surface HDC hdc; TRY_ERR_DD(Image->GetDC(&hdc)) HDC hdcImage = CreateCompatibleDC(NULL); SelectObject(hdcImage, hbm); DeleteObject(hbm); BitBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, 0, 0, SRCCOPY); DeleteDC(hdcImage); TRY_ERR_DD(Image->ReleaseDC(hdc)) } return Image; }
Maintenant, le vraie problème. lorsque j'essai de récupérer le contexte de périphérique avant d'avoir afficher mes images, ca ne marche pas, mes images ne s'affiche plus, pourquoi ?
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #define TRY_ERR_DD(x) {HRESULT rval = x; if(rval != DD_OK) exit(0);} ... HDC hdc; TRY_ERR_DD(primsurf->GetDC(&hdc))
Partager