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 :

comment faire un "print ecran"


Sujet :

DirectX

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut comment faire un "print ecran"
    bonjour
    je voudrais sauvegarder dans une image ce qu'il y a dans ma fenetre directX.
    comme une sorte de print ecran

    merci

    Sylvain

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    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
    bool Screenshot(const std::string& pFilename)
    {
    	// Surface de destination
    	LPDIRECT3DSURFACE9 Surface = NULL;
     
    	// Récupération du backbuffer
    	if (FAILED(m_Device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &Surface)))
            return false;
     
    	// Sauvegarde de la surface dans le fichier
    	if (FAILED(D3DXSaveSurfaceToFile(pFilename.c_str(), D3DXIFF_BMP, Surface, NULL, NULL)))
       {
            Surface->Release();
            return false;
       }
     
    	// Destruction de la surface
       Surface->Release();
     
       return true;
    }
    Si tu actives le multisampling il te faudra plutot récupérer le front buffer, mais ça je crois que t'en auras pas besoin.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    Moi j'utilise :

    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
     
    bool CUserInterface::TakeScreenShot ( )
    {
    	char Filename [ 64 ] = "Screenshot" ;
     
    	time_t ltime ; 
    	time ( & ltime ) ;
     
    	// Might overwrite existing files 
    	// Probability is extremely low though, so we dont care 
    	sprintf( Filename, "ScreenShot_%ld.bmp" , ltime ) ;
    	//
    	IDirect3DSurface9 * FrontSurface = NULL ;
    	// Surface size must be the current desktop window size 
    	int Width  = GetSystemMetrics ( SM_CXSCREEN ) ;
    	int Height = GetSystemMetrics ( SM_CYSCREEN ) ;
    	HRESULT hr = Game->m_pd3dDevice->CreateOffscreenPlainSurface 
    		( Width, Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, & FrontSurface, NULL ) ;
    	hr = Game->m_pd3dDevice->GetFrontBufferData ( 0, FrontSurface ) ;
    	if ( FAILED( hr ) )
    	{
    		SAFE_RELEASE ( FrontSurface ) ;
    		TCHAR Msg  [ ] = TEXT ( "WARNING - CUserInterface::TakeScreenShot failed.\n" ) ;  
    		CTools::Log ( Msg ) ; 
    		Game->OnCrash ( Msg ) ; 
    		return false ;
    	} ;	 
    	D3DXSaveSurfaceToFile ( Filename, D3DXIFF_BMP, FrontSurface, NULL, NULL ) ;
    	SAFE_RELEASE ( FrontSurface ) ;
    	return true ; 
    }
    Quelle methode est la meilleure pour recuperer la surface ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Moi en fait j'utilise les 2 : front buffer quand je suis en fullscreen et backbuffer quand je suis en fenetré (j'ai jamais vraiment cherché a savoir pourquoi, mais en tout cas il a l'air de pas aimer quand je recupere le front buffer en fenetré).

    A part l'histoire d'antialiasing, je pense que c'est kif kif (et niveau perfs on s'en fout un peu).

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 79
    Points : 37
    Points
    37
    Par défaut
    ahh les joies de la programmation directx. je fais de l'opengl maintenant et je trouve ca + simple.
    J'avais fait une fonction qui prend des screenshot en continu si ca t'interesse sylvain_bos.

    Salut a Loulou24 et LaurentUSA qui m'avaient bien aide pendant mon stage

  6. #6
    Membre averti Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Points : 332
    Points
    332
    Par défaut
    Au début je préférais OpenGL à DirectX aussi, mais qd g vu tt ce qu'on pouvait faire avec DirectX en natif et facilement, g tt de suite retourné ma chemise !!!
    Vive directX on fait tt plein d'effets en 2sec chrono, au début c compliqué je le reconnais, mais une fois ds le bain on comprend tt

  7. #7
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 44
    Points
    44
    Par défaut
    merci a vous ca marche nickel

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Loulou24
    Moi en fait j'utilise les 2 : front buffer quand je suis en fullscreen et backbuffer quand je suis en fenetré (j'ai jamais vraiment cherché a savoir pourquoi, mais en tout cas il a l'air de pas aimer quand je recupere le front buffer en fenetré).

    A part l'histoire d'antialiasing, je pense que c'est kif kif (et niveau perfs on s'en fout un peu).
    c pk en fenetre quand tu recupere le front buffer tu recupere tout l'ecran et pas uniquement ta fenetre donc dx te fait une erreur comme quoi t'as pas assez de place dans la surface
    mais donne lui la resol de ton ecran et ca marchera
    j'en ai deduit que le front buffer et le buffer ecran a proprement parler
    c'est ce qui sera envoye a l'ecran

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/09/2009, 00h02
  2. comment faire une capture d'ecran sur une form?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/08/2007, 19h20
  3. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25

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