begin process at 2012 05 30 08:10:32
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

Update de l'affichage de plusieurs fenêtres


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Update de l'affichage de plusieurs fenêtres

dimanche 17 septembre 2006 à 20:24:19 | Update de l'affichage de plusieurs fenêtres

by_rabbit_08

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


dimanche 17 septembre 2006 à 23:23:58 | Re : Update de l'affichage de plusieurs fenêtres

BruNews

Administrateur CodeS-SourceS
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++
lundi 18 septembre 2006 à 09:41:50 | Re : Update de l'affichage de plusieurs fenêtres

by_rabbit_08

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
lundi 18 septembre 2006 à 09:58:52 | Re : Update de l'affichage de plusieurs fenêtres

BruNews

Administrateur CodeS-SourceS
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++
lundi 18 septembre 2006 à 10:42:31 | Re : Update de l'affichage de plusieurs fenêtres

by_rabbit_08

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

lundi 18 septembre 2006 à 10:55:12 | Re : Update de l'affichage de plusieurs fenêtres

by_rabbit_08

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

lundi 18 septembre 2006 à 11:08:53 | Re : Update de l'affichage de plusieurs fenêtres

BruNews

Administrateur CodeS-SourceS

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++

lundi 18 septembre 2006 à 11:43:28 | Re : Update de l'affichage de plusieurs fenêtres

by_rabbit_08

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
lundi 18 septembre 2006 à 17:21:53 | Re : Update de l'affichage de plusieurs fenêtres

BruNews

Administrateur CodeS-SourceS

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++

lundi 18 septembre 2006 à 17:47:47 | Re : Update de l'affichage de plusieurs fenêtres

by_rabbit_08

Merci :D! J'ai pas encore lu, mais merci beaucoup d'avance!


Cette discussion est classée dans : temps, barre, boite, caractères, dialogue


Répondre à ce message

Sujets en rapport avec ce message

Comment inserer une barre d'outils dans une boite de dialogue [ par Lady ] merci Barre horizontale de boite de dialogue [ par Vortex99011 ] Je voudrais savoir comment créer une barre horizontale dans une boite de dialogue. Barre de Progression et Boite de Dialogue [ par by_rabbit_08 ] Bonjour! Je désirerais créer une ProgressBar dans une boite de dialogue. Mais voilà, il ne me semble pas que cela soit possible de déclarer une barre communication avec une boite de dialogue fille [ par yag00 ] bonjourj'ai une boite de dialogue qui contient un control progressbar. je veux que la barre de progression s'incremente et ferme la fenetre une fois a Le programme ne répond pas. [ par mohdaef ] Bonsoir.J'ai fait un petit programme en boite de dialogue dans lequel, lors d'un appui sur un bouton une fonction est lancée. Cette fonction contient UDdate d'une vue a partir d'une boite de dialogue [ par Uno22 ] Bonjour,J'ai un petit probleme de mise à jour avec les MFCEn fait, au départ j'ai une vue dans la quelle je récupere pas mal de paramètre comme adress listview dans la boite de dialogue [ par javadev1 ] slt. je suis débutant en programmation. j'utilise visual c++ 2003 pour apprendre. mon problème est le suivant : je crée un projet win32 et par défaut Clignoter au rythme du son...... [ par jb_exe ] Bonjour à tous,je programme sous Visual C++ 6.0.je cherche le moyen de faire clignoter des icones dans une boite de dialogue, en fonction du son lu da appeller OnInitDialog() depuis une autre fenetre [ par sewahass ] salut s'il vous plait, comment je peux depuis une boite de dialogue A obligé une autre boite de dialogue à appeller sa fonction OnInitDialog()???la cl boite de dialogue avec visual c++ [ par romanticide ] Bonjourje voudrais ouvrir une boite de dialogue pour afficher les règles de mon jeu (l'utilisateur fait un clic droit puis sélectionne règle ce qui ou


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,574 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales