[SDL] capture d'ecrant en sdl

capture d'ecrant en sdl [SDL] - C - Programmation

Marsh Posté le 03-07-2006 à 14:09:00    

...

Message cité 1 fois
Message édité par big_dadi_fat le 11-07-2006 à 22:47:07
Reply

Marsh Posté le 03-07-2006 à 14:09:00   

Reply

Marsh Posté le 03-07-2006 à 14:28:48    

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 :)


Reply

Marsh Posté le 03-07-2006 à 14:30:41    

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

Reply

Marsh Posté le 03-07-2006 à 14:35:36    

Serial Coder a écrit :

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


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

Reply

Marsh Posté le 03-07-2006 à 14:39:38    

c'est le menu Debug de Code::Blocks

Reply

Marsh Posté le 03-07-2006 à 14:42:38    

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.

Reply

Marsh Posté le 03-07-2006 à 15:48:13    

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 !  
 :)

Reply

Marsh Posté le 03-07-2006 à 23:34:15    

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
Reply

Marsh Posté le 09-07-2006 à 11:11:36    

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:

Reply

Marsh Posté le 10-07-2006 à 08:55:03    

SDL_SaveBMP(ecran, "screenshot.bmp" )

Reply

Marsh Posté le 10-07-2006 à 08:55:03   

Reply

Marsh Posté le 10-07-2006 à 09:12:56    

Reply

Marsh Posté le 10-07-2006 à 14:38:32    

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. }


 

Reply

Marsh Posté le 10-07-2006 à 14:40:39    

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

Reply

Marsh Posté le 11-07-2006 à 23:06:58    

_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 :)

Reply

Marsh Posté le 13-07-2006 à 12:11:51    

UP
 
 
 
 

Reply

Marsh Posté le 13-07-2006 à 14:00:06    

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
Reply

Marsh Posté le 13-07-2006 à 14:29:09    

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
 

Reply

Marsh Posté le 13-07-2006 à 14:41:15    

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

Reply

Marsh Posté le 13-07-2006 à 14:42:58    

_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
Reply

Marsh Posté le 13-07-2006 à 14:44:44    

Reply

Marsh Posté le 13-07-2006 à 23:43:02    


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

Reply

Marsh Posté le 14-07-2006 à 17:30:03    

UP
 
 

Reply

Marsh Posté le 17-07-2006 à 12:23:29    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed