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

Résolu
Signaler
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
-
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
-
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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
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?
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
J'ai oublié le return FALSE; après KillTimer().
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Yé ca marche!! merci beacoup!!
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
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"
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
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é
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
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"
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Merci pour le conseil