Lancer un CDialog sans bloquer

Résolu
perig Messages postés 358 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 5 septembre 2006 - 28 juil. 2006 à 17:56
perig Messages postés 358 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 5 septembre 2006 - 1 août 2006 à 10:58
Bonjour,


C'est encore moi :oD


voila, j'utilise C++(MFC) (pour ceux qui ne le savent pas encore :o)


et je souhaiterais pouvoir lancer une fenetre (un CDialog par exemple) mais sans bloquer mon application!
Car je connais doModal mais ca me bloque mon appli tant que le CDialog n'est pas refermé :(

Exist'il un autre moyen pour lancer un CDialog?

Merci!

---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même

8 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 juil. 2006 à 16:27
Salut,

D'apres msdn, ca se fait avec Create().
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
31 juil. 2006 à 09:11
d'un Create(), oui, suivi d'un ShowWindow() quand même...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
31 juil. 2006 à 11:58
Pour le signe "Pour cent", c'est normal: il faut le doubler: %% (même raison que pour '\' et '\\')

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
3
perig Messages postés 358 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 5 septembre 2006
31 juil. 2006 à 10:25
Merci,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>


J'ai tout de même cherché une petite heure pourquoi mon create ne marchait pas lol


Il faut en effet un



ShowWindow(SW_SHOW)





Par contre autre question pour le même truc :


J'ouvre donc ma fenêtre. Cette fenêtre (DialogProgress) comprend le pourcentage d’avancement de qqch (avec un affichage texte et une barre de progress).



 




Maintenant j’ai une fonction qui est longue a s'exécuter et qui appel donc une callback pour pouvoir donner l'état d'avancement.
Cette Callback met à jour un champ de mon DialogProgress (ca marche) mais j'ai juste ce champ de visible (tout le reste de ma fenêtre est grise comme figée)


Savez vous pourquoi ? Je dois faire un rafraichissement complet de ma fenêtre à chaque appel ?



 





Un peut de code pour une explication peut-être plus claire :




En globale :







Include ‘ProgressDlg.h’







ProgressDlg DialogProgress ;







 







Dans le même fichier : (la fonction call back qui est bien appelée et qui marche très bien)







     
BOOL WINAPI ProgressFunc(UINT Percent,CINEHANDLE CH)







{








            Progress.Update(Percent);








           
return TRUE;







}







 







Toujours dans le même fichier dans le code :







DialogProgress.Create(IDD_Progress,this);








      DialogProgress.ShowWindow(SW_SHOW);








      StructDeSave->SaveCine(ProgressFunc);








      DialogProgress.OnCancel();







 







Dans ProgresDlg.h :






   class

ProgressDlg : public CDialog







   {








      DECLARE_DYNAMIC(ProgressDlg)








 







   public
:








      ProgressDlg(CWnd* pParent = NULL);   // standard constructor








     
virtual ~ProgressDlg();







   // Dialog Data








     
enum { IDD = IDD_Progress };








     










 







   protected
:








     
virtual
void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support








 








      DECLARE_MESSAGE_MAP()








 







   public
:








     
void Update(UINT Percent);








     
void OnCancel(void);







   };







 







Et dans ProgressDlg.cpp







// ProgressDlg.cpp : implementation file







//








 






   #include

"stdafx.h"







   #include
"RdvPhantom.h"







   #include
"ProgressDlg.h"







// ProgressDlg dialog








 







   IMPLEMENT_DYNAMIC(ProgressDlg, CDialog)







   ProgressDlg::ProgressDlg(CWnd* pParent /*=NULL*/)








      : CDialog(ProgressDlg::IDD, pParent)







   {







   }








 







   ProgressDlg::~ProgressDlg()







   {







   }








 







   void
ProgressDlg::DoDataExchange(CDataExchange* pDX)







   {








         CDialog::DoDataExchange(pDX);





   }








 








 







   BEGIN_MESSAGE_MAP(ProgressDlg, CDialog)







   END_MESSAGE_MAP()








 







   void
ProgressDlg::Update(UINT Percent)







   {








        CString CStringTemps;








      CStringTemps.Format("%u%",Percent);








      SetDlgItemText(IDC_Value,CStringTemps);







   }   







   void
ProgressDlg::OnCancel()







   {








      CDialog::OnCancel();







   }



Une idée de pourquoi ca fige? Et une solution surtout (si possible) lol

Merci!!!
---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
0

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

Posez votre question
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
31 juil. 2006 à 11:01
Il faut, je pense, forcer le rafraichissement avec la fonction Invalidate();

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
perig Messages postés 358 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 5 septembre 2006
31 juil. 2006 à 11:24
Nop, ca change rien, j'obtiens :  (seulement le chiffre, meme pas le signe %"

Aulieu de  : (avec Avancement =x%)

---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
0
perig Messages postés 358 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 5 septembre 2006
1 août 2006 à 09:54
Pour le % j'avais essayé le\ mais je n’avais pas pensé à doubler le signe ;)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>


Par contre mon interface fige toujours, j'ai essayé de mettre ma fonction SaveCine (celle qui bouffe les ressources) dans un thread et donc mon callback est appelé a partir de ce thread et il met a jour mon dialog mais j'ai toujours le même problème, voir même... ca ne marche pas à tout les coups, parfois ca fige carrément tout Windows et un ctrl+alt+sup est nécessaire pour tuer la tache!

---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
0
perig Messages postés 358 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 5 septembre 2006
1 août 2006 à 10:58
Finalement j'ai trouvé une solution (pas très propre a mon gout mais ca marche)
C'est que la fonctions dans la quelle je fessais la création de ma fenêtre ne rendait pas la main tant que le thread était actif et visiblement ca figer le prog

Je lance donc ma DialogProgresse puis je lance mon thread en lui passant un pointeur de cette Dialog.


Ma fonction qui lance tout ceci se termine alors et le thread continue son travail
il lance la fonction bloquante qui elle même appelle couramment la callback pour témoigner de l'avancement via la Dialog box.


A la fin du thread celui-ci ferme et détruit simplement la DialogProgress.



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 




Voila ce qui me gène c’est que la destruction de mon tread est finalement pas synchronisé avec mon prog principal mais bon… ce n’est pas trop gênant !


Merci de ton aide, je devrais pouvoir m'entirer maintenant!

---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
0
Rejoignez-nous