Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2042 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Afficher une voite de dialogue pendant x secondes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Afficher une voite de dialogue pendant x secondes

n°794584
choupinou
Posté le 13-07-2004 à 12:30:56  profilanswer
 

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?

mood
Publicité
Posté le 13-07-2004 à 12:30:56  profilanswer
 

n°794646
m0rbac
Posté le 13-07-2004 à 13:21:04  profilanswer
 

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 ?

n°794659
m0rbac
Posté le 13-07-2004 à 13:31:57  profilanswer
 

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
n°794861
choupinou
Posté le 13-07-2004 à 16:38:31  profilanswer
 

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

n°794981
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 13-07-2004 à 17:18:16  profilanswer
 

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)
n°795034
m0rbac
Posté le 13-07-2004 à 17:37:53  profilanswer
 

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
n°795043
m0rbac
Posté le 13-07-2004 à 17:40:53  profilanswer
 

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
n°795969
christophe​_d13
L'efficacité à tout prix.
Posté le 15-07-2004 à 08:13:42  profilanswer
 

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

n°796142
choupinou
Posté le 15-07-2004 à 10:47:08  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Afficher une voite de dialogue pendant x secondes

 

Sujets relatifs
[resolu] [Javascript] Afficher un DIV onclickcentrage d'une boite dialogue microsoft excel
vba comment faire un recherche dans une feuille et l'afficher ?boite de dialogue avec tempo
Pouvoir afficher ma webcam sur une page web[PHP] Permettre d'afficher les apostrophes, guillemets...
Swing][JFilechooser]Afficher l'arborsonce d'une machine Distante[Access] comment n'afficher que le formulaire au demarrage
convertir hh:mm en secondes[résolu] Page générée en x.y secondes : comment faire ?
Plus de sujets relatifs à : Afficher une voite de dialogue pendant x secondes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR