Afficher une voite de dialogue pendant x secondes

Afficher une voite de dialogue pendant x secondes - C++ - Programmation

Marsh Posté le 13-07-2004 à 12:30:56    

Bonjour, j'ai créé une boite de dialogue en utilisant les ressources et elle ne comporte aucun contrôle. J'aimerais l'afficher pendant un certains temps (pendant que le programme exécute une autre action) mais soit elle s'affiche et tant que l'utilisateur n'appui pas sur la touche entrée, le programme reste dans le même état soit elle ne s'affiche pas du tout.  
J'ai essayé de faire  
 

Code :
  1. CDlg dlg;
  2.    
  3.   dlg.DoModal();   //attente de validation => NON


 
 
et  

Code :
  1. CDlg dlg;
  2.    
  3.   dlg.BeginModalState();   //Ne s'affiche pas  
  4.   //...instructions à exécuter  
  5.   dlg.EndModalState();


 
 
Est-ce que quelqu'un sait comment faire ou a déjà utilisé les boites de dlg modeless?

Reply

Marsh Posté le 13-07-2004 à 12:30:56   

Reply

Marsh Posté le 13-07-2004 à 13:21:04    

A mon avis, il faudrait que tu crée un timer dans ta fenêtre et que celui-ci appelle une fonction de fermeture de fenêtre (OnOK() ou OnCancel() devrait faire l'affaire).
En fait, je ne suis pas sûr de bien comprendre ce que tu veux: quand tu dis

Citation :

pendant que le programme exécute une autre action

, est-ce que ton "programme", c'est la fenêtre en question ou une autre fenêtre qui a ouvert celle sans contrôle ?

Reply

Marsh Posté le 13-07-2004 à 13:31:57    

Choupinou a écrit :

Est-ce que quelqu'un sait comment faire ou a déjà utilisé les boites de dlg modeless?


C'est tout écrit dans le MSDN, y'a qu'à chercher un peu  ;) Mais bon, je sais que c'est parfois pénible de chercher, alors je vais être bon prince et donner la solution:
il faut que la classe de ta fenêtre modeless ressemble à ça:

Code :
  1. class CModelessDlg: public CDialog
  2. {
  3. private:
  4.   using CDialog::Create;
  5.   DECLARE_DYNAMIC(CModelessDlg)
  6. public:
  7.   CModelessDlg(CWnd* pParent = NULL);   // standard constructor
  8.   virtual ~CModelessDlg();
  9.   BOOL Create();
  10. // Dialog Data
  11.   enum { IDD = IDD_MODELESSDLG };
  12. protected:
  13.   CWnd* m_pParent;
  14.   int m_nID;    /**< Window ID. */
  15.    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  16.    DECLARE_MESSAGE_MAP()
  17. };


Ensuite, dans le constructeur, pense à garder un pointeur sur la fenêtre mère, parfois c'est assez utile :)

Code :
  1. IMPLEMENT_DYNAMIC(CModelessDlg, CDialog)
  2. CModelessDlg::CModelessDlg(CWnd* pParent /*=NULL*/)
  3.   : CDialog(CModelessDlg::IDD, pParent)
  4. {
  5.   ASSERT(pParent != NULL);
  6.   m_pParent = pParent;
  7.   m_nID = CModelessDlg::IDD;
  8. }


 
Reste encore la fonction Create à implémenter:

Code :
  1. BOOL CModelessDlg::Create()
  2. {
  3.   return CDialog::Create(m_nID, m_pParent);
  4. }


 
Maintenant, pour créer une instance de la fenêtre, il ne faut pas utilsier le DoModal, mais le Create():

Code :
  1. CModelessDlg dlg = new CModelessDlg(this);
  2. dlg->Create();


Finalement, utilise le DestroyWindow() pour fermer la fenêtre, et n'oublie pas de détuire le pointeur. En fait, comme en général une fenêtre modeless est faite pour être utilisée en même temps qu'une autre, il faut créer l'instance de la fenêtre modeless en tant que variable membre de la fenêtre mère, c'est plus pratique pour pouvoir accéder à la fenêtre modeless depuis n'importe où dans le code de la fenêtre mère.
 
Voilà, je pense n'avoir rien oublié.


Message édité par m0rbac le 13-07-2004 à 13:39:28
Reply

Marsh Posté le 13-07-2004 à 16:38:31    

J'ai essayé mais rien ne s'affiche.
De plus, quand j'écris :

Code :
  1. CModelessDlg dlg = new CModelessDlg(this);
  2.   dlg->Create();


le compilo met :
http://img25.exs.cx/img25/9899/erreurs.jpg
Si j'écris :

Code :
  1. CModelessDlg *dlg = new CModelessDlg(this);
  2.   dlg->Create();


le compilo met :
http://img25.exs.cx/img25/1737/erreur2.jpg
Par contre si :

Code :
  1. CModelessDlg *dlg = new CModelessDlg();
  2.   dlg->Create();


Là rien ne se passe. Je pense que c'est à cause du pointeur NULL par défaut

Reply

Marsh Posté le 13-07-2004 à 17:18:16    

morbac >> t'as oublié de mettre un  

Code :
  1. dlg->ShowWindow();


après le Create()
 
Comme ta box ne semble pas avoir l'attribut WS_VISIBLE, le ShowWindow() est obligatoire après la création
 
Choupinou >> c'est quoi cette classe CSplashScreen ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 13-07-2004 à 17:37:53    

Harkonnen a écrit :

morbac >> t'as oublié de mettre un  

Code :
  1. dlg->ShowWindow();


après le Create()
 
Comme ta box ne semble pas avoir l'attribut WS_VISIBLE, le ShowWindow() est obligatoire après la création


Oui ou bien plus simplement si tu crées ta fenêtre avec l'éditeur de fenêtres, tu peux aller dans les propriétés de la fenêtre, sous "More Styles" et cocher "Visible".


Message édité par m0rbac le 13-07-2004 à 17:42:01
Reply

Marsh Posté le 13-07-2004 à 17:40:53    

Choupinou >> Est-ce que ta CSplashScreen hérite bien de CWnd ? ou de CFrameWnd, ou de CDialog ?
Bon et si tu n'arrives pas à passer le pointeur this, envoie NULL à la place, mais ne compte pas avoir de pointeur sur la fenêtre mère depuis la fenêtre fille. Au passage, il faudra enlever le ASSERT(pParent != NULL);


Message édité par m0rbac le 13-07-2004 à 17:48:55
Reply

Marsh Posté le 15-07-2004 à 08:13:42    

Tu préfèrerais pas le faire en API32 ?
C'est tellement plus simple.

Reply

Marsh Posté le 15-07-2004 à 10:47:08    

C'est bon ça marche. Merci pour votre aide

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed