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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair� 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
    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
    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
    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 confirm�
    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
    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

  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
    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 confirm�
    Inscrit en
    Octobre 2002
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 39
    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

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