IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

[DirectDraw7] Affichage de plusieurs image bmp


Sujet :

DirectX

  1. #1
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut [DirectDraw7] Affichage de plusieurs image bmp
    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 :

    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);
    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
    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;
    }
    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 ?)

    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 ?
    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))
    Merci

  2. #2
    mat.M
    Invité(e)
    Par défaut
    primsurf->Flip(NULL, DDFLIP_WAIT);
    Sleep(2000);
    primsurf->Flip(NULL, DDFLIP_WAIT); //
    NOOONN pas de Sleep dans la boucle d'affichage !!!!!

    La méthode Flip c'est la dernière à utiliser et UNE SEULE FOIS !
    On l'utilise dans le WinMain (ou bien on y fait appel dans une fonction de rendu d'affichage ) à la suite du traitement des messages: While GetMessage PeekMessage puis alors appel à une fonction d'affichage qui contient SurfacePrimaire->Flip

    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
     
    static DWORD dwStart=timeGetTime(); 
    static DWORD dwNext=timeGetTime(); 	// important ! déclarer en static
    		if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )//
            {
                if( !GetMessage( &msg, NULL, 0, 0 ) )
                    return msg.wParam;
                TranslateMessage(&msg);
                DispatchMessage(&msg);
           }
    	else
    dwNext=timeGetTime(); 
    if((dwNext-dwStart)>2000)// 2000ms
     
    {SurfaceAttachee->Blt(Surface1...);
    SurfaceAttachee->Blt(Surface1....);
    // on peut faire aussi Surface2->BltFast(Surface1......) ou bien Blt
    SurfacePrimaire->Flip(...)
    Je ne comprends pas ton problème ; pour afficher toute une suite de BMP il faut copier judicieusement toutes les surface dans lequelles tu as chargé des bitmaps les unes sur les autres puis pour finir sur la surface attachée à la surface primaire.
    Cette surface primaire sera affiché en dernier à l'écran.
    Pour gérer les temporisations pas de Sleep !!!
    Il faut utiliser timeGetTime ,obtenir une valeur en Ms de départ , puis une courante faire la différence et si cette différence c'est la tempo voulue alors on effectue l'affichage mais pas de Sleep !
    j'ai nombreux exemples là dessus.

  3. #3
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    D'accord pour le flip et le sleep, j'ai compris.
    Pour le hdc, il fallait simplement le libérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    primsurf->ReleaseDC( hdc );
    Merci

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Pour le hdc, il fallait simplement le libérer :
    Erreur classique de programmation win32

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. affichage de plusieurs images dans une même figure
    Par kawther dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 20/02/2009, 18h45
  2. [POO] Affichage de plusieurs images sur un meme emplacement, par clic.
    Par luke-skywalker dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/02/2009, 15h33
  3. [Stratégie] Affichage de plusieurs images : limiter le nb de connexions ?
    Par Bobsinglar dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 08/04/2008, 18h18
  4. Réponses: 9
    Dernier message: 17/05/2007, 13h20
  5. Affichage de plusieurs images dans dans un Timage
    Par Petzouille57 dans le forum Delphi
    Réponses: 1
    Dernier message: 19/10/2006, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo