Faire avancer une bar de progression régulièrement: problème...

Résolu
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 - 14 sept. 2006 à 18:24
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 - 15 sept. 2006 à 12:39
Bonjour!
J'ai un tout petit problème avec une progressbar... bizar non?
Enfait, je voudrais qu'elle s'affiche toute seule lors de l'ouverture d'une boite de dialogue! Donc pour l'affichage pas de problème, mais j'aimerais qu'elle se remplisse simplement selon un système de for(i=0;i<100;i++) avec des Sleep de 1 seconde entre chaque avancement! Néanmoins, il n'y a un truc qui joue pas, car je ne sais si je dois la mettre dans WM_COMMAND, dans WM_CREATE, etc... Alors j'explique, j'ai commencé par la mettre dans WM_INITDIALOG, mais elle ne s'affichait pas dû aux Sleep, et s'affichait, une fois que tout était terminé, vaguement et disparaissait! J'ai alors tanté de la mettre dans WM_COMMAND; mais la je la voyais se remplir lorsque j'appuyais sur la croix pour fermer la fenêtre! J'ai alors essayé dans WM_CREATE, mais là, rien du tout! Donc comment faire pour qu'elle s'affiche automatiquement à l'ouverture de la boite de dialogue, et qu'elle n'ai pas besoin d'interaction avec l'utilisateur? Voici le petit bout de code:

BOOL APIENTRY Dialog3Proc(HWND hDlg3,UINT uMsg2,WPARAM wParam,LPARAM lParam)
{
    static HWND progress_bar;
    switch (uMsg2)
    {
     
      case WM_INITDIALOG:
     
      SetWindowText(hDlg3,"salut");
      InitCommonControls();
      progress_bar = CreateWindow(
                 PROGRESS_CLASS,
                 (LPSTR) NULL,
                  WS_CHILD|WS_VISIBLE,
                  0, 0, 385,25,
                  hDlg3,
                  (HMENU)ID_PROGRESS1,
                   hinstance2,
                   NULL);
        ShowWindow(progress_bar,SW_SHOWNORMAL);
      //SendMessage(hDlg3, WM_COMMAND, 0, 0);
        //while(SendMessage ( progress_bar , PBM_GETPOS , 0 , 0 )!=100)

       
      return FALSE;

      case WM_CREATE:

      SendMessage( progress_bar , PBM_SETRANGE , 0 , MAKELPARAM ( 0 , 100 ) ) ;
        SendMessage( progress_bar , PBM_SETSTEP , MAKEWPARAM ( 1 , 0 ) , 0 ) ;

        for(i=0;i<100;i++)
        {
          SendMessage(progress_bar, PBM_SETPOS, i, 0);
          Sleep(10);
        }

      return TRUE;

      case WM_COMMAND:
     
        EndDialog(hDlg3,0);
        return TRUE;
   
      break;
     
      default:
         return FALSE;
    }
}

Comme vous pouvez le voir, elle est ici dans WM_CREATE... Ah oui, j'ai essayé une dernière possibilité: je l'ai placé dans WM_COMMAND; et dans WM_INITDIALOG, j'ai fais SendMessage(hDlg3, WM_COMMAND, 0, 0), mais cela a agit comme si je l'avais mis dans WM_INITDIALOG...
Est-ce que quelqu'un saurait? Je suis certain, que c'est une petite faute, mais je n'arrive pas à la trouver...
Merci!

11 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 sept. 2006 à 19:10
Si tu veux que la progressbar avance au lancement de la boite de dialogue, tu peux utiliser un timer car rien ne s'affiche tant que le traitement de WM_INITDIALOG ne retourne pas une valeur (FALSE dans ton cas). On initialise alors un timer à la fin de ce traitement en utilisant la fonction SetTimer(). On met la boucle dans le traitement du message WM_TIMER. Juste après la boucle, on détruit le timer avec KillTimer():

case WM_INITDIALOG:
//......
SetTimer(hDlg3,1,1000,0);
return FALSE;

case WM_TIMER:
// boucle d'avancement
KillTimer(hDlg3,1);

Dans cet exemple, l'avancement de la progressbar commence une seconde après l'affichage de la boite de dialogue.
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 sept. 2006 à 18:39
Salut,
Une boite de dialogue ne reçoit pas de WM_CREATE. Ce message est destiné aux fenêtres. Son équivalent est donc WM_INITDIALOG.
0
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 1
14 sept. 2006 à 18:45
Oui, mais comme je l'ai marqué, cela se bloque dans WM_INITDIALOG, je n'arrive pas à faire avancer la bar de progression, sais-tu pourquoi?
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 sept. 2006 à 18:47
L'avancement de la progressbar doit se faire en dehors de WM_INITDIALOG.
Pour regarder ta progressbar se remplir tu peux utiliser un timer ou ajouter un bouton.

Le paramètre lParam de WM_COMMAND, contient le HWND du bouton cliqué.
C'est pendant le traitement de ce clic que tu mets ta boucle de
remplissage.
0

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

Posez votre question
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 1
14 sept. 2006 à 18:52
Merci de ta réponse, mais je suis désolé, je ne comprends pas :S
Dans quel partie du switch dois-je mettre la progression? et comment faire? Si c'est dans WM_COMMAND, comment faire pour que cela s'exécute, car s'il n'y a pas de bouton, le programme passe tout droit non? :O
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
14 sept. 2006 à 19:12
J'ai oublié le return FALSE; après KillTimer().
0
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 1
14 sept. 2006 à 19:17
Yé ca marche!! merci beacoup!!
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 sept. 2006 à 22:06
Comment on peut utiliser des progress bar et avoir autant de difficulté comme ça ???
Si tu prenais la peine de lire quelques ptits truc, tu poserais moins de question comme ça
C'est pas que ça me gêne, mais voilà quoi, WM_COMMAND, c'est lorsque tu fais une action, je pense pas qu'il y a ai la moindre action à faire pour faire avancer ta barre selon tes explications.
Lit une bonne doc !!! Met toi à la MSDN et réfléchi un tit peu

ULARGE_INTEGERJokyQi=QI("Joky"
0
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 1
14 sept. 2006 à 23:22
C'est bien gentil, mais je sais pas si tu as remarqué, j'ai eu besoin d'aller dans WM_TIMER pour résoudre mon problème... Donc je sais pas si MSDN m'aurait beaucoup aider pour cela...Et le reste étaient des proposition, pour pas simplement exposer mon problème et ne pas laisse tout le monde se débrouiller, avec mon simple petit soucis... Enfin désolé
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 sept. 2006 à 23:29
Ben évidemment, mais y'a quand même une certaine logique à avoir quand on code.
C'est sur que tu n'aurais pas trouver WM_TIMER tout seul, mais on est là pour ça
En faite, faut juste éviter d'essayer à tatons et de réfléchir un tout ptit peu.
Après on pose les questions.

ULARGE_INTEGERJokyQi=QI("Joky"
0
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 1
15 sept. 2006 à 12:39
Merci pour le conseil
0
Rejoignez-nous