Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1733 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [SDL] capture d'ecrant en sdl

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SDL] capture d'ecrant en sdl

n°1399479
big_dadi_f​at
Posté le 03-07-2006 à 14:09:00  profilanswer
 

...

Message cité 1 fois
Message édité par big_dadi_fat le 11-07-2006 à 22:47:07
mood
Publicité
Posté le 03-07-2006 à 14:09:00  profilanswer
 

n°1399490
big_dadi_f​at
Posté le 03-07-2006 à 14:28:48  profilanswer
 

big_dadi_fat a écrit :

Slut je suis entrain de suivre un cours sur SDL et j'ai trouvé un exercice don voici l'enoncé:
 

Citation :


Faites en sorte que lorsqu'on clique avec la souris sur l'écran, ça colle un Zozor à l'endroit indiqué.  
on veut "coller" à l'écran 10 Zozors maximum à la fois.
vous n'avez besoin que d'une surface Zozor;
La difficulté sera de savoir comment initialiser ces positions, car il ne faut pas qu'il y ait de Zozors affichés à l'écran au départ. A vous de trouver une solution pour ne pas blitter de Zozor si, par exemple, les coordonnées sont (-1, -1).  
 
La touche "Suppr" doit servir à effacer l'écran (il faudra réinitialiser toutes les coordonnées à (-1, -1) par exemple).  


 
 
pour info zezor est une image das mon code c'est hap, et dans mon code j'efface avec la touche s et pas avec supp;
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<SDL/SDL.h>
  4. int main(int argc , char* argv[])
  5. {
  6.     SDL_Surface *ecran=NULL, *hap=NULL;
  7.     SDL_Rect pos;
  8.     int continuer=1,i=0;
  9.     SDL_Event event;
  10.     SDL_Init(SDL_INIT_VIDEO);
  11.     ecran = SDL_SetVideoMode(600,400,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
  12.     hap = SDL_LoadBMP("hap.bmp" );
  13.     SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
  14.     while(continuer)
  15.     {
  16.         SDL_WaitEvent(&event);
  17.         switch(event.type)
  18.         {
  19.             case SDL_QUIT: continuer = 0;break;
  20.             case SDL_MOUSEBUTTONDOWN:
  21.               if(event.button.button == SDL_BUTTON_LEFT)
  22.               {
  23.                   pos.x = event.button.x;
  24.                   pos.y = event.button.y;
  25.                   if(i<5) SDL_BlitSurface(hap,NULL,ecran,&pos);
  26.                   i++;
  27.               }
  28.             break;
  29.             case SDL_KEYDOWN:
  30.                if(event.key.keysym.sym == SDLK_s)
  31.                {
  32.                    SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
  33.                    i = 0;
  34.                }
  35.             break;
  36.         }
  37.         SDL_Flip(ecran);
  38.     }
  39.     SDL_Quit();
  40.     return EXIT_SUCCESS;
  41. }


 
 
mais le problaime c'est que sa marche du 1er coup seulement , càd: quand j'affiche 10 image et ensuite j'efface l'ecran avec la touche s , je ne peut plus afficher d'autre image à la suite  
 
merci :)


n°1399493
Serial Cod​er
Posté le 03-07-2006 à 14:30:41  profilanswer
 

t'as jamais pensé à essayer le debugger de code::blocks ?

n°1399500
big_dadi_f​at
Posté le 03-07-2006 à 14:35:36  profilanswer
 

Serial Coder a écrit :

t'as jamais pensé à essayer le debugger de code::blocks ?


le debuquoi ?
 
comment ça ? c'est quoi ?
 

n°1399507
Serial Cod​er
Posté le 03-07-2006 à 14:39:38  profilanswer
 

c'est le menu Debug de Code::Blocks

n°1399513
_darkalt3_
Proctopathe
Posté le 03-07-2006 à 14:42:38  profilanswer
 

big_dadi_fat a écrit :

le debuquoi ?
 
comment ça ? c'est quoi ?


 
Ca sert à executer ton programme ligne par ligne en vérifiant la valeur de chacune de tes variables à l'instant de l'interruption, comme ca tu peux vérifier que tout va bien, ou si ca va pas, ca  peux t'aider à trouver l'erreur , si par exemple une variables est nulle alors que t'en attend qqchose, etc.

n°1399580
big_dadi_f​at
Posté le 03-07-2006 à 15:48:13  profilanswer
 

enfait dans la parti ou il y a:  

Code :
  1. if(event.key.keysym.sym == SDLK_s)
  2.                {
  3.                    i = 0;
  4.                    SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran-
  5. >format,0,0,0));
  6.                }
  7.                break;


 
si je la remplace par:  

Code :
  1. if(event.key.keysym.sym == SDLK_s)
  2.                {
  3.                  
  4.                    SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
  5.                    i = 0;
  6.                }
  7.                break;


 
ca marche;  
 
mais je ne vois pass la differance entre les deux !  
 :)

n°1399902
el muchach​o
Comfortably Numb
Posté le 03-07-2006 à 23:34:15  profilanswer
 

Bizarre. Sans debugger et qq traces, tu n'es pas prêt de deviner. Une possibilité serait un effet de bord entre SDL_WaitEvent et la fonction SDL_FillRect, mais je n'en mettrais pas ma main à couper.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1403174
big_dadi_f​at
Posté le 09-07-2006 à 11:11:36  profilanswer
 

RE
 
enfait je me demander aussi , comment en fait pour prendre une capture d'ecrant en sdl ,  
/* un exemple sera le bien venu  :)  */
 
encor merci
 
 :hello:

n°1403519
Ace17
Posté le 10-07-2006 à 08:55:03  profilanswer
 

SDL_SaveBMP(ecran, "screenshot.bmp" )

mood
Publicité
Posté le 10-07-2006 à 08:55:03  profilanswer
 

n°1403529
_darkalt3_
Proctopathe
Posté le 10-07-2006 à 09:12:56  profilanswer
 
n°1403852
big_dadi_f​at
Posté le 10-07-2006 à 14:38:32  profilanswer
 

J'ai fais le petit prog suivant , mais ca me marche pas , => sa marche quand je compile(ctrl F9) (0:error , 0:warning) , mais quand j'execute (F9) la fenaitre se ferme rapidemant toute seul !
 
voici le code :
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<SDL/SDL.h>
  4. #define L 800
  5. #define H 600
  6. int main(int argc , char* argv[])
  7. {
  8.     SDL_Surface *ecran, *fond;
  9.     SDL_Rect position;
  10.     SDL_Event event;
  11.     int continuer=1;
  12.     SDL_Init(SDL_INIT_VIDEO);
  13.     ecran = SDL_SetVideoMode(L,H,32, SDL_HWSURFACE );
  14.     SDL_SaveBMP(fond, "screenshot.bmp" );
  15.     SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,250,255,255));
  16.     SDL_WM_SetCaption("Pro section raf",NULL);
  17.     position.x = 0;
  18.     position.y = 0;
  19.     SDL_SetAlpha(fond,SDL_SRCALPHA,128);
  20.     SDL_BlitSurface(fond,NULL,ecran,&position);
  21.     SDL_Flip(ecran);
  22.     while (continuer)
  23.     {
  24.         SDL_WaitEvent(&event);
  25.         switch(event.type)
  26.         {
  27.             case SDL_QUIT:  continuer=0;
  28.         }
  29.     }
  30.     SDL_FreeSurface(fond);
  31.     SDL_Quit();
  32.     return EXIT_SUCCESS;
  33. }


 

n°1403853
_darkalt3_
Proctopathe
Posté le 10-07-2006 à 14:40:39  profilanswer
 

debug et vois où exactement ça foire...
 
au passage, ton savebmp prend "fond" qui n'est pas initialisé...

n°1405045
big_dadi_f​at
Posté le 11-07-2006 à 23:06:58  profilanswer
 

_darkalt3_ a écrit :

debug et vois où exactement ça foire...
 
au passage, ton savebmp prend "fond" qui n'est pas initialisé...


 
oups ok j'ai oublier d'initialiser fond , mnt j'ai changer le code ,et je fais avec SDL_SaveBMP(ecran, "screenshot.bmp" );
 
et ca me crée une image bmp : screenshot.bmp dans mon projet c'est bon .
 
 
je veut poser une autre question svp:
l'image screenshot.bmp contien le screenshot du contenu de la fenaitre , mais si en veut prendre le screenshot de toute l'ecrant de l'ordi ( comme la touche imp écr ) ya t'il un moyen de le faire ?
 
encore merci :)

n°1406254
big_dadi_f​at
Posté le 13-07-2006 à 12:11:51  profilanswer
 

UP
 
 
 
 

n°1406319
Serial Cod​er
Posté le 13-07-2006 à 14:00:06  profilanswer
 

bonjour big_dadi_fat
 
réaliser une capture de l'écran est très simple : tu as en premier lieu, besoin du device context de l'écran que tu veux capturer. pour ceci, tu peux utiliser la fonction GetClientRect() de la fenêtre concernée, ce qui te renverra la zone client de cette fenêtre dans un handle. ensuite, tu dois créer le contexte via CreateCompatibleDC() et la copier dans un bitmpap via la fonction CreateCompatibleBitmap(). une fois ceci fait, tu assignes le device context au bitmap, et tu termines par un petit BliBlt() vers le clipboard.
mais j'entends déjà ta question : comment obtenir un handle sur le clipboard correctement aligné ? hé hé, je te devance : via la fonction GetParent(), tu récupères le pointeur de la fenêtre fille, et il te suffit d'appeler ensuite OpenClipboard(). ensuite, un petit coup de SetClipboardData() avec ton bitmap, et voila, ta capture est faite


---------------
Je code en série et en parallèle
n°1406354
big_dadi_f​at
Posté le 13-07-2006 à 14:29:09  profilanswer
 

Serial Coder a écrit :

bonjour big_dadi_fat
 
réaliser une capture de l'écran est très simple : tu as en premier lieu, besoin du device context de l'écran que tu veux capturer. pour ceci, tu peux utiliser la fonction GetClientRect() de la fenêtre concernée, ce qui te renverra la zone client de cette fenêtre dans un handle. ensuite, tu dois créer le contexte via CreateCompatibleDC() et la copier dans un bitmpap via la fonction CreateCompatibleBitmap(). une fois ceci fait, tu assignes le device context au bitmap, et tu termines par un petit BliBlt() vers le clipboard.
mais j'entends déjà ta question : comment obtenir un handle sur le clipboard correctement aligné ? hé hé, je te devance : via la fonction GetParent(), tu récupères le pointeur de la fenêtre fille, et il te suffit d'appeler ensuite OpenClipboard(). ensuite, un petit coup de SetClipboardData() avec ton bitmap, et voila, ta capture est faite


 
Merci Serial Coder tu est le meilleur  :)  , je vais essayer avec ça ;
mais si tu me donne un exemple de code c , se sera encore meilleur (pour mieux eclersire tout ça) ?
 
encore merci Serial Coder
 

n°1406364
_darkalt3_
Proctopathe
Posté le 13-07-2006 à 14:41:15  profilanswer
 

sauf que c'est pas en SDL tout ça :)

n°1406366
big_dadi_f​at
Posté le 13-07-2006 à 14:42:58  profilanswer
 

_darkalt3_ a écrit :

sauf que c'est pas en SDL tout ça :)


Donc c'est en quoi ?
 
 
 :??:


Message édité par big_dadi_fat le 13-07-2006 à 14:43:18
n°1406367
_darkalt3_
Proctopathe
Posté le 13-07-2006 à 14:44:44  profilanswer
 
n°1406750
big_dadi_f​at
Posté le 13-07-2006 à 23:43:02  profilanswer
 


 
et comment on utilise ca en c ?   en incluant :   #include<windows.h>   ?
 
 :??:

n°1406987
big_dadi_f​at
Posté le 14-07-2006 à 17:30:03  profilanswer
 

UP
 
 

n°1408010
_darkalt3_
Proctopathe
Posté le 17-07-2006 à 12:23:29  profilanswer
 

msdn :o
 
ou google quoi mais cherche un peu bourdel :o

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [SDL] capture d'ecrant en sdl

 

Sujets relatifs
[Resolu] [SDL] taille d'une image en px[SDL] Affichage dans un thread
Interface graphique programme en SDL ???[recrutement] Projet de shoot 2D en SDL
[SDL]seg fault à la fermeture en mode consoleTbrowser capture de lien avant echange serveur
utilisation manette / SDLPetit problème en SDL ...
Capture d'une image par webcam en C puis traitement de cette imageInstallation librairie SDL sous linux: cannot find -lmingw32
Plus de sujets relatifs à : [SDL] capture d'ecrant en sdl


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR