Update de l'affichage de plusieurs fenêtres

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
-
Bonsoir!
J'aurais une petite question! J'ai créé un programme qui pendant un certain temps gère des caractères et les modifie, pour du cryptage. Donc pendant ce temps la, j'ai placé une barre de progression. Pour la modification des caractères, ca donne un peu près ca, en language courant:

while(!feof(fichier)
{
  //Ici, je lis les caractères et les modifies, le code n'est pas important, je ne le met pas...

SendMessage(progress_bar, PBM_SETPOS, Pourcentage, 0);
}

Avec bien sur un incrémentation à chaque fois pour le pourcentage... Le problème c'est que pendant ce temps, si je passe une autre fenêtre par dessus, toute mon application est gelé, et on ne voit plus rien, je ne sait donc pas comment mettre à jour. J'ai essayé simplement avec UpdateWindow, mais ça ne marchait pas très bien, et ça prennait plus de temps qu'autre chose. Est-ce que quelqu'un aurait une solution à mon problème?
Ensuite, 2ème simple petite question, tout cela se fais dans une procédure de boite de dialogue, et à partir de cette procédure je lance une nouvelle boite de dialogue où il y a ma barre de progression.
En gros ça donne ça:
MainWindow
|_____________> hDlg1--> Modification des caractère
                                |________>hDlg2--->Barre de progression

Donc comment faire pour que lorsque la boite de dialogue 2 est ouverte, on ne puisse pas "activer" la première boite de dialogue? Enfin comme pour la boite de dialogue 1 par rapport à la fenêtre principale... J'espère que c'est clair!
Merci à ceux qui veulent bien m'aider

9 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
On met une dialog modale quand on ne veut pas qu'une autre puisse être ouverte.
Une procédure longue doit aller dans un thread.

ciao...
BruNews, MVP VC++
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Alors j'ai en quelques sortes résolu le deuxième problème, mais quoique... Etant donné que mes dialogbox étaient déjà modales, j'ai placé 2-3 EnableWindow.. Mais je vais encore voir. Mais le problème revient au même, c'est toujours pour mettre à jour l'affichage de mon programme pendant l'encryptage.. Je ne sais pas si tu as répondu à cela BruNews, en parlant de procédure longue et de thread, peux-tu m'en dire un peu plus?
Merci
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
thread est un sujet bien trop vaste pour l'expliquer ici.
Faut lire Richter:
http://brunews.com/brunews/download/JR4.zip
http://brunews.com/brunews/download/JR4Sources.zip

Exemples aussi dans mes sources et tant d'autres sur cppfrance.

ciao...
BruNews, MVP VC++
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Merci c'est gentil, j'ai déjà réussi à créer un petit peu, en ayant ma procédure de boite de dialogue, qui appelle un thread.
Dans la procédure du thread, il y a ceci:

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

//cryptage de mes caractères..... et mise à jour de la progress_bar

return 0;

Et je suis sur que le programme s'execute jusqu'à l'affichage de la progress_bar, au début, mais ne va pas plus loin. Comment cela se fait-il? Doit je récupérer des messages quelques part? Genre avec GetMessage()? Serait-il possible d'avoir un petit peu d'aide complémentaire vite dit...
Merci bien
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Je tiens juste à clarifier un tout petit peu les choses, car je vois que ce n'est pas clair du tout...
Voila mon code en un peu plus clair:

//voilà la boite de dialogue sur laquelle la progressbar s'affiche
BOOL APIENTRY Dialog3Proc(HWND hDlg3,UINT uMsg2,WPARAM wParam,LPARAM lParam)
{  
   
   
   
    switch (uMsg2)
    {
     
      case WM_INITDIALOG:
     
      //SetWindowText(hDlg3,"salut");
      EnableWindow(hDlg2,FALSE);//fenêtre depuis la quelle on affiche la boite de dialogue contenant la progress_bar
      EnableWindow(hwnd2,FALSE);
      InitCommonControls();
      progress_bar = CreateWindow(
                 PROGRESS_CLASS,
                 (LPSTR) NULL,
                  WS_CHILD|WS_VISIBLE|PBS_SMOOTH,
                  5, 10, 345,25,
                  hDlg3,
                  (HMENU)ID_PROGRESS1,
                   hinstance2,
                   NULL);
        ShowWindow(progress_bar,SW_SHOWNORMAL);
       
      SetTimer(hDlg3,1,0,0);
       
      return FALSE;
      
      case WM_TIMER:
      KillTimer(hDlg3,1);
      hThread=CreateThread('\0','\0',ThreadProc,'\0','\0',&ThreadId);
       
      return FALSE;
     
     
      case WM_COMMAND:
       
        EndDialog(hDlg3,0);
        return TRUE;
   
      break;
     
      default:
         return FALSE;
    }
}

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
     SendMessage( progress_bar , PBM_SETRANGE , 0 , MAKELPARAM ( 0 , 100 ) ) ;
        SendMessage( progress_bar , PBM_SETSTEP , MAKEWPARAM ( 1 , 0 ) , 0 ) ;

//Ici ce trouve tout le travail, les calculs, l'affichage de la progress_bar, etc...

EnableWindow(hDlg2,TRUE);
    EnableWindow(hwnd2,TRUE);
    EndDialog(hDlg3,0);
 return 0;
}

Voila! Donc enfait, depuis mon dernier message, j'ai fait quelques modification, et maintenant ça marche, sauf que c'est extrêment lent, et que la ligne tout à la fin EndDialog(hDlg3,0); n'agit pas.. J'entends par la, que la boite de dialogue(hDlg3) contenant la progress_bar ne se ferme pas :S
Voila j'ai essayé d'être le plus clair possible, ça serait gentil d'obtenir un petit peu d'aider :O
Merci d'avance
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Beaucoup trop le souk:
- Pourquoi un timer ?
- Que fait InitCommonControls() ici, se met au debut de WinMain.
- Mets la progressbar avec def de la dialog dans le fichier rc.

Toute la conception à revoir, pas le temps.

ciao...
BruNews, MVP VC++
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Ben le timer, c'est pour que la progress_bar s'affiche dès le lancement de la dialogbox, c'est quelqu'un sur le forum qui me l'avait conseillé!
InitCommonControls(), je l'ai placé au début de mon programme néanhmoins ca ne change rien. Et la progressbar, pourquoi est-ce que je devrait la déclarer en fichier rc? Je la créer avec CreateWindow, jusque la ça allait bien! :O C'est la aussi quelqu'un du forum qui me la conseillé... Mais si c'est indispensable, dis le moi!
Mais au pire de la lenteur, je m'en fiche, j'aimerais juste savoir comment faire pour que mon EndDialog(hDlg3,0) à la fin de mon programme fonctionne et que la boite de dialogue qui contient la progressbar se ferme... Est-ce que c'est possible, vu comme j'ai fais les choses?
Merci
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
La création des controles est au bas mot 200 fois plus rapide si tout est en ressource plutot qu'a coup de CreateWindow.
Je fais donc le cas que tout est défini dans le rc.


#define THRD_INIT  (WM_USER + 100)
#define THRD_END  (WM_USER + 101)
HANDLE hthread = 0;


DWORD WINAPI ThreadProc(LPVOID pparam)
{
  // BOULOT DU THREAD ICI
  // HWND PROGRESSBAR DANS pparam POUR LA MANIPULER
  // ABSOLUMENT SORTIR A LA LIGNE DESSOUS QUOI QU'IL ARRRIVE
thrdExit:
  PostMessage(GetParent((HWND) pparam), THRD_END, 0, 0);
  return 0;
}


INT_PTR CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_INITDIALOG:
      SetClassLongPtr(hdlg, GCLP_HICON, (long)LoadIcon(0, IDI_APPLICATION));
      // ON LANCE THREAD EN LAISSANT AFFICHAGE SE FAIRE (return 1)
      PostMessage(hdlg, THRD_INIT, 0, 0);
      return 1;
    case THRD_INIT:
      hthread = CreateThread(0, 0, ThreadProc, (LPVOID) hPrgrss, 0, 0);
      break;
    case THRD_END:
      CloseHandle(hthread); hthread = 0;
      // AUTRES TRUCS SI BESOIN
      break;
    case WM_COMMAND:
      switch(wParam) {
        case IDCANCEL:
          if(!hthread) EndDialog(hdlg, 0);
      }
  }
  return 0;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
  InitCommonControls();
  DialogBoxParam(hInstance, (LPCTSTR)IDD_APP, 0, AppDlgProc, 0);
  return 0;
}

ciao...
BruNews, MVP VC++
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Merci :D! J'ai pas encore lu, mais merci beaucoup d'avance!