Diaporama d'images bitmaps... le plus simple possible...

Druith2 Messages postés 8 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 23 avril 2004 - 22 avril 2004 à 10:10
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 23 avril 2004 à 23:26
Bonjour, je galère depuis le début de la semaine (je suis un neophyte veritable). Je cherche un moyen simple pour créer un diaporama de 12 images bitmaps.

Alors, j'arrive à afficher un bitmap tt seul. Mais je ne sais pas comment modifier mon code pour que disons toutes les 0.5 secondes, un autre prenne sa place et ce en boucle...

J'ai pensé à creer un timer... mais je ne sais pas où le placer dans mon code ni comment l'utiliser... Je peux toujours vous proposer mon code de départ, meme i je sais qu'il me faut le modifier pas mal...

Je remercie ceux qui accepteront de me guider... J'ai vraiment besoin de ce programme et je désespère....

LRESULT CALLBACK WinProc(HWND fenetre2, UINT message2, WPARAM wParam, LPARAM lParam)
{

static HBITMAP hbitmap;		// pour le bitmap

switch (message2)
     {
          case WM_KEYDOWN:
           switch(wParam)
           {
           case VK_UP:
// creation d'un rectangle
RECT rect;
rect.top=0;
rect.left=0;
rect.bottom=0;
rect.right=0; 
// maintenant k change la valeur des couleurs des pixels 
k+=50;
    if(k>250) k=0;
// on demande à redessiner la zone de rect avec un message WM_PAINT
InvalidateRect(fenetre2,&rect,FALSE);
break;
case VK_ESCAPE:
DestroyWindow(fenetre2);
break;
default:
break;

 }
 break;

case WM_PAINT:
HDC hdc;HDC hdcMemory;
PAINTSTRUCT ps;
hdc=BeginPaint(fenetre2,&ps);

                // un bitmap

BITMAP bm;
hbitmap=(HBITMAP) LoadImage(NULL,"menu.bmp",IMAGE_BITMAP,nHori,nVert,LR_LOADFROMFILE); 
  

                hdcMemory=CreateCompatibleDC(NULL); 
SelectObject(hdcMemory,hbitmap);
GetObject(hbitmap,sizeof(bm),&bm);
BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hdcMemory,0,0,SRCCOPY);

DeleteDC(hdcMemory);

EndPaint(fenetre2,&ps); 
break;

          // Fermeture du programme
          case WM_DESTROY:
          DeleteObject(hbitmap);        //--> supprime le bmp
          // Ferme le programme
          PostQuitMessage(0);
          break;


(j'ai piqué ce code sur TEXEL et je l'ai remis à ma sauce, donc y'a des chances pour qu'il ne soit po tres bo... :/ )

7 réponses

Druith2 Messages postés 8 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 23 avril 2004
22 avril 2004 à 10:11
oups, j'avais pas fait gaffe que ca faisait un mini troll...

"Les fous sont aux échecs les plus proches des rois" :blush)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
22 avril 2004 à 11:59
création du Timer (dans WM_CREATE par ex):
SetTimer(hWnd, 0x100, 500, NULL);
0x100 : Id du timer créé
500 : cadence en ms.

en suite, toute les 500ms le message WM_TIMER est envoyé, il te suffit de le gérer, de modifier le bitmap à afficher et de redemander l'affichage de la fenêtre :
InvalidateRect(hWnd, NULL, FALSE);
UpdateWindow(hWnd);
le dernier paramètre de InvalidateRect indique de ne pas redessiner le fond (pour éviter un clignotement et utilie si ton bitrmap à dessiner prend toute la fenêtre).
0
Druith2 Messages postés 8 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 23 avril 2004
22 avril 2004 à 14:00
Merci, j'y vois un peu plus clair. Je vais voir ce que je vais reussir à en faire.

"Les fous sont aux échecs les plus proches des rois" ;)
0
Druith2 Messages postés 8 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 23 avril 2004
22 avril 2004 à 18:05
Voilà ce que j'ai fait :

case WM_TIMER: // timer : changement des bitmaps

bool time;
char* bmp;
int i = 0;
time SetTimer(fenetre2, 0x100, 500, NULL); // 0x100 id timer | 500 : durée timer

if(int time = true) { // quand le message du timer est envoyé
i++ ;
}

switch(i) {
case 1 : bmp = "./bmp/image.bmp"; // change la date de bmp (titre du bmp à changer)
break;
case 2 : bmp = "./bmp/image2.bmp";
break;
case 3 : bmp = "./bmp/image3.bmp";
break;
default : i = 0 ; //réinitialisation du compteur
}

}

plus loin, j'ai mis :

hbitmap=(HBITMAP) LoadImage(NULL,bmp,IMAGE_BITMAP,nHori,nVert,LR_LOADFROMFILE);


Ceci dit, mon compilateur (dev-C++) refuse de compiler en me disant pour la ligne d'apres qui est :

case WM_KEYDOWN: (voir script complet précédent post)

--> jump to case label

Quelqu'un comprend mon problème ?? Merci d'avance

"Les fous sont aux échecs les plus proches des rois" :question)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
23 avril 2004 à 00:48
le SetTimer est à mettre dans WM_CREATE, ce qui crée un timer qui va envoyer le message WM_TIMER, ta variable de compteur (i, mais à rennomer en qqchose de plus "parlant") doit être globale, ainsi que bmp.

case WM_TIMER: // timer : changement des bitmaps
i++ ;

switch(i) {
case 1 : bmp = "./bmp/image.bmp"; // change la date de bmp (titre du bmp à changer)
break;
case 2 : bmp = "./bmp/image2.bmp";
break;
case 3 : bmp = "./bmp/image3.bmp";
break;
default : i = 0 ; //réinitialisation du compteur
}

pour l'erreur, surrement un pb de paire {} mal équlibére entre les switch et les case (fait des sous-fct pour les case de la WndProc, ce sera plus clair).
0
Druith2 Messages postés 8 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 23 avril 2004
23 avril 2004 à 10:53
Merci encore une fois.

Maintenant, j'ai ca :

LRESULT CALLBACK WinProc(HWND fenetre2, UINT message2, WPARAM wParam, LPARAM lParam)
{
//variables globales
static HBITMAP hbitmap;		// pour le bitmap
int diapo = 0;                        //variable de compteur
char* filename;                     // variable de nom de fichier 

switch (message2)
     {
          case WM_CREATE:
                  
              SetTimer(fenetre2, 101, 500, NULL);           
             
         
           case WM_TIMER: // timer : changement des bitmaps
             
              diapo++;
               
              switch(diapo) {
                case 1 : filename = "./bmp/1984.bmp";   // chnage la date de bmp (titre du bmp à changer)
                break;
                case 2 : filename = "./bmp/1987.bmp";
                break;
                case 3 : filename = "./bmp/1989.bmp";
                break;
                [...]
                case 11 : filename = "./bmp/2004.bmp";
                break;
                default : diapo = 0 ;
                }



Et au niveau de l'affichage du bitmap :
hbitmap=(HBITMAP) loadImage(NULL,filename,IMAGE_BITMAP,nHori,nVert,LR_LOADFROMFILE); 


Je détruit le setTimer ds le WM_DESTROY, tout se compile à merveille, mais lorsque je lance l'execution, aucune image ne s'affiche à l'écran...
%-6

"Les fous sont aux échecs les plus proches des rois"
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
23 avril 2004 à 23:26
tes variables diapo et filename ne sont toujours pas globales.
met les ststic aussi ou met les en dhors du copr de WndProc.
0
Rejoignez-nous