IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] instance unique de dialogue non modale


Sujet :

MFC

  1. #1
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut [MFC] instance unique de dialogue non modale
    Salut,

    comment procedez vous pour faire une boite de dialogue non modale unique , c est a dire que quand on clique sur le menu pour afficher la boite , si elle existe deja elle apparait maximisé sinon elle est crée

    j ai essayé avec une classe singleton mais c pas terrible car j ai l impression que ma boite de dialogue n est jamais vraiment detruite

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    salut, dans la faq tu peux savoir si elle est déjà lancée (avec findwindow).
    et si c'est le cas, tu fais un showwindow dessus pour l'afficher

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    la methode singleton fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
     
        static CAboutDlg *m_pTheInstance;
        static CAboutDlg *GetInstance()
        {
    		if(CAboutDlg::m_pTheInstance) 
    		{
    			CAboutDlg::m_pTheInstance->BringWindowToTop();
    			return CAboutDlg::m_pTheInstance;
    		}				
    		CAboutDlg *pDlg = new CAboutDlg();	
    		pDlg->Create(IDD_ABOUTBOX,NULL);
    		pDlg->ShowWindow(SW_SHOW);		
    		return pDlg;
        }
    // Dialog Data
    	//{{AFX_DATA(CAboutDlg)
    	enum { IDD = IDD_ABOUTBOX };
    	CBaseEdit	m_Edit;
    	//}}AFX_DATA
     
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CAboutDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    	virtual void PostNcDestroy();
    	virtual void PreSubclassWindow();
    	//}}AFX_VIRTUAL
     
    // Implementation
    protected:
    	//{{AFX_MSG(CAboutDlg)
    	virtual BOOL OnInitDialog();
    	virtual void OnOK();
     
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
     
    CAboutDlg *CAboutDlg::m_pTheInstance=NULL;
     
    void CAboutDlg::PostNcDestroy() 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	CAboutDlg::m_pTheInstance=NULL;
    	CDialog::PostNcDestroy();
            delete this;
    }
     
    void CAboutDlg::PreSubclassWindow() 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	CAboutDlg::m_pTheInstance=this;
    	CDialog::PreSubclassWindow();
    }
    //----------------------------------
    void CAboutDlg::OnOK() 
    {
    	// TODO: Add extra validation here
    	DestroyWindow();
    	//CDialog::OnOK();
    }
    l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // App command to run the dialog
    void CMDISampleApp::OnAppAbout()
    {
    	//boutDlg aboutDlg;
    	//outDlg.DoModal();
           CAboutDlg::GetInstance();
    }
    Note:Attention si on laisse faire le mecanisme de base sur OnOk et OnCancel
    la fonction PostNcDestroy() n'est pas appellée ainsi que le message WM_DESTROY.

  4. #4
    Membre régulier
    Avatar de Alice9
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2004
    Messages : 124
    Points : 85
    Points
    85
    Par défaut re
    Hello Farscape,

    je n'ai pas un pointeur sur l'objet mais une instance directement placée comme attribut protégée de ma classe CMainFrame.
    Mais je pense que cela doit marcher un peu pareil.

    Pour faire disparaitre le boîte flottante, je viens d'essayer la fonction que tu m'as indiquée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_myDlgBar.DestroyWindow()
    De cette manière,quand je clic sur le menu View\MyDlgBar qui fait appel aux fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void CMainFrame::OnViewDlgbar() 
    {
    	// TODO: Add your command handler code here
    	if (m_myDlgBar.IsWindowVisible() != FALSE)
    	{
    		m_myDlgBar.DestroyWindow() ;
    	}
    	else
    	{
    		// boîte flottante visible
    	}
    }
     
    void CMainFrame::OnUpdateViewDlgbar(CCmdUI* pCmdUI) 
    {
    	// TODO: Add your command update UI handler code here
    	pCmdUI->SetCheck(TRUE == m_dlgBarTest.IsWindowVisible() ? 1:0) ;
    }
    j'ai bien réussi à fermer ma boîte flottante mais par contre dès que je clic sur le menu View de mon application ça plante.

    Du coup j'ai ajouté via Wizard la fonction DestroyWindow dans la classe ma boîte de dialogue.


    A ce moment je passe bien dans la fonction qui fait correctement appel à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CDialogBar::DestroyWindow()
    J'ai toujours le même problème : ça se feme mais l'application plante au prochain évènement....


    Alice
    Alice

    A coeur vaillant, rien d'impossible !

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    il ne faut pas utiliser une variable de l'objet mais un pointeur sur l'objet ,les boites de dialogues supportent mal la reutilisation du même objet .
    et utiliser le mecanisme d'auto delete dans la fonction postncdestroy .


  6. #6
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 39
    Points : 40
    Points
    40
    Par défaut
    Solution plus simple
    tu crees ton dialog quand le parent est cree
    a l'etat initial le dialog est caché
    si tu veux le montrer tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_tondlg.ShowWindow(SW_SHOW);
    sinon pour le cacher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_tondlg.ShowWindow(SW_HIDE)
    puis a la fin quand tu en as plus besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_tondlg.DestroyWindow()

Discussions similaires

  1. OpenGL et boîte de dialogue "non-modal"
    Par Gerber samuel dans le forum OpenGL
    Réponses: 1
    Dernier message: 27/02/2006, 23h49
  2. Réponses: 8
    Dernier message: 11/10/2005, 16h15
  3. Réponses: 2
    Dernier message: 28/07/2005, 13h58
  4. [Virtual Pascal] [OWL] Actions clavier dans un dialogue non modal
    Par Alcatîz dans le forum Autres IDE
    Réponses: 3
    Dernier message: 28/07/2005, 11h04
  5. dimension boite de dialogue non modale
    Par afan dans le forum MFC
    Réponses: 25
    Dernier message: 21/10/2004, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo