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] - MDI : fermer/ouvrir et cacher/voir une CDialogBar [FAQ]


Sujet :

MFC

  1. #1
    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 [MFC] - MDI : fermer/ouvrir et cacher/voir une CDialogBar
    Bonjour,

    Toujours et encore dans la jungle des CDialogBars ...

    J'ai une application MDi avec une boîte de dialogue flottante.
    Cette boîte peut être fermée grâce à son icône dans sa barre de tâche.

    Je cherche le moyen de faire disparaitre cette boîte sans passer par clic sur icône ainsi que le moyen de faire réapparaitre cette dernière.

    Pour la faire disparaitre :
    J'ai essayé de faire appel au message WM_CLOSE en le déplaçant dans le Message Map comme le WM_INITDIALOG afin de pouvoir réellement l'atteindre (voir FAQ)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON_MESSAGE(WM_CLOSE, OnClose)
    ceci ne fonctionne pas.

    Quand on clic sur l'icône de fermeture de la boîte, je ne passe pas par cette fonction :

    Du coup je me demande si cette boîte est vraiment détruite !
    Ou alors elle peut être cachée.
    Pour cela je fait un test de visibilité sur la boîte en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_myDlgBar.IsWindowVisible
    , il m'indique correctement si la boîte est visible ou non.
    Vous pourrez me dire que cette fonction répondra aussi non si la boîte est détruite.... si une solution existe pour tester son existence je suis preneuse.

    Pour la faire réapparaitre :
    Au début je pensais qu'elle était détruite et qu'il fallait qu'elle soit recréée. Là, il me sort violemment du programme car il semblerait qu'elle existe déjà (d'où mon problème d'accès mémoire)
    Aussi j'ai essayé de cacher la boîte en lui faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_myDlgBar.ShowWindow(1)
    Ceci permet de cacher tous les composants de la boîte sans la cacher elle même. Je me retrouve visuellement avec une boîte vide.

    D'où ma question : mais qu'elle est cette astuce pour femer/cacher une telle boîte (un peu comme une toolBar ou une statusBar quand on fait dans le menu View d'une application) ?

    Si vous aviez une p'tite idée pour me sortir de ma détresse ....

    par avance beaucoup de votre

    Alice

  2. #2
    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
    si tu disposes du pointeur sur la fenetre tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pDlg->DestroyWindow();
    regarde aussi ce post:
    http://www.developpez.net/forums/vie...637503#1637503

  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
    j'ai supprimé ton autre message "re ",
    post a la suite de celui-ci merci.

  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
    Merci, comme tu l'as remarqué c'était une ptite bourde ... oups désolée ...

    Bon ceci dit revenons à nos moutons :

    Ici j'utilise un pointeur sur ma boîte :
    comme attribut protégée de ma CMainFrame.
    Aussi juste avant de créer cette boîte comme expliquée dans la je l'alloue (création d'une fonction protégée de la classe CMainFrame pour éviter de le réécrir à chaque fois) :

    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
    int CMainFrame::CreateDlgBarTest()
    {
    	m_myDlgBar = new (CMyDlgBar) ;
    	if (!m_myDlgBar ->Create(this, IDD_DLGBAR,
    	// collée à droite
    	CBRS_RIGHT | CBRS_GRIPPER |CBRS_TOOLTIPS | CBRS_FLYBY|CBRS_HIDE_INPLACE,
    	IDD_DLGBAR))
    	{
    		TRACE0("Failed to create dialog bar m_wndDlgBar\n");
    		return -1;		// fail to create
    	}
    	// caractéristiques : se colle sur tous les bords de la fenêtre
    	m_myDlgBar ->EnableDocking(CBRS_ALIGN_ANY);
    	EnableDocking(CBRS_ALIGN_ANY);
    	DockControlBar(m_myDlgBar );
     
    	CPoint point ;
    	point.x = 200 ;
    	point.y = 200 ;
    	FloatControlBar(m_myDlgBar ,point); 
    	return 0 ;
    }
    Donc pour faire apparaitre/fermer cette boîte, l'utilisateur clic sur le menu View\MyDlgBar. Aussi j'ai les fonctions suivante :
    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
     
    void CMainFrame::OnViewDlgbar() 
    {
    	// TODO: Add your command handler code here
    	if (m_myDlgBar!= NULL)
    	{
    		// boîte flottante cachée
     
    		m_myDlgBar->DestroyWindow() ;
    		m_myDlgBar= NULL ;
    	}
    	else
    	{
    		// boîte flottante visible
                   CreateDlgBarTest()
    	}
    }
     
    void CMainFrame::OnUpdateViewDlgbar(CCmdUI* pCmdUI) 
    {
    	// TODO: Add your command update UI handler code here
    	pCmdUI->SetCheck(NULL != m_myDlgBar ? 1:0) ;
    }
    Et là ça marche sans faire planter le programme !!! (apparition disparition de la boîte) à condition que l'utilisateur le fasse à partir du menu View.

    maintenant mon problème est de faire réapparaitre la boîte si l'utilisateur la détruit via son icône de fermeture ....

    Merci encore pour l'info.

    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
    Points : 17 323
    Points
    17 323
    Par défaut
    le plus simple c'est de mettre dans l'objet dialog un pointeur sur la mainframe ,initialisé au moment de la creation .
    quand l'objet se detruit il positionne quelque chose un flag ce que tu veux dans la mainframe (en fait ton pointeur stocke dans ta mainframe )....


  6. #6
    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
    heu vraiment désolée je crains d'avoir posté un msg avant qu'il ne soit fini .... si c le cas encore mille fois oups et désolée mais j'ai des enclumes au bout des mains....

    donc pour que la fermeture de la boîte par son icône croix soit prise en compte par le menu (ce qui permet de la rafficher) j'ai modifiée les fonctions liées au menu View\MyDlgBar :
    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
    void CMainFrame::OnViewDlgbar() 
    {
    	// TODO: Add your command handler code here
    	if (m_myDlgBar != NULL)
    	{
    		if (m_myDlgBar ->IsWindowVisible() != TRUE)
    		{
    			//la boîte a été fermée avec l'icône
    			// boîte flottante visible
    			m_myDlgBar ->DestroyWindow() ;
    			m_myDlgBar = NULL ;
    			CreateDlgBarTest() ;
    		}
    		else
    		{
    			// boîte flottante cachée
    			m_myDlgBar ->DestroyWindow() ;
    			m_myDlgBar = NULL ;
    		}
    	}
    	else
    	{
    		// boîte flottante visible
    		CreateDlgBarTest() ;
    	}
    }
     
    void CMainFrame::OnUpdateViewDlgbar(CCmdUI* pCmdUI) 
    {
    	// TODO: Add your command update UI handler code here
     
            // cas classique de gestion coché/décoché de MyDlgBar
    	pCmdUI->SetCheck(NULL != m_myDlgBar ? 1:0) ;
            // cas de la fermeture de la boîte par son icône
    	if (m_myDlgBar != NULL)
    		pCmdUI->SetCheck(FALSE != m_myDlgBar ->IsWindowVisible() ? 1:0) ;
    }
    Donc avec tout ça, c cool : ça marche !!!!

    sinon si tu comprends la nuance de la notion d'inivisibilité de la boîte flottante via sa fermeture par l'icône ... ça m'intéresse. Je croyais que c'était liée à la fonction showWindow ? (qui ne fonctionne pas tout à fait comme je veux avec une CDialogBar)

    Merci encore de ta patiente.

    Alice

  7. #7
    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,
    si j'ai bien compris essaye ça:
    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
     
    class CMyDlgBar : public CDialogBar
    {
    public:
    //......
    // ClassWizard generated virtual function overrides
       //{{AFX_VIRTUAL(CMyDlgBar)
       protected:
       virtual void PostNcDestroy();
       //}}AFX_V
     
    public:
    CMDIFrameWnd *m_pMainFrame;
     
    };
    void CMyDlgBar::PostNcDestroy()
    {
       // TODO: Add your specialized code here and/or call the base class
       CAboutDlg::m_pTheInstance=NULL;
       CDialog::PostNcDestroy();
       delete this;
       static_cast<CMainFrame *>(m_pMainFrame)->m_mydlgBar=NULL;
    }
     
    //................
    int CMainFrame::CreateDlgBarTest()
    {
       m_myDlgBar = new CMyDlgBar ; 
       m_myDlgBar->m_pMainFrame=this;
    //................
    }

  8. #8
    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
    2 news :

    la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_cast<CMainFrame *>(m_pMainFrame)->m_mydlgBar=NULL;
    fait planter le programme quand je détruis la boîte par le menu View\MyDlgBar

    quand on clic sur l'icône de la boîte flottante : on ne passe pas par la fonction PostNcDestroy.

    sinon ce que je t'ai proposé juste avant marche très bien mais cela m'ennuie de ne pas comprendre pourquoi la fermeture de la boîte par son icône ne passe pas par cette fonction.

    -> dois je en déduire que ce n'est pas une destruction totale de la boîte mais seulement une disparition de l'objet graphique ?
    si c'est cela, je pense qu'il doit exister une fonction pour réimprimmer la boîte non ?

    A+

    Alice

  9. #9
    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 Help
    J'essaye de faire de plus en plus fort.

    Au lieu d'avoir 1 boîte flottante, j'en ai 2 définies respectivement par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	CTestMDI_DlgBar * m_dlgBarTest ;
    	C2ndDlgBar      * m_2ndDlgBar ;
    Pointeurs insérées comme attributs de la classe CMainFrame...

    Voici un bout de code de ma classe CMainFrame :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    ....
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
     
    	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    	{
    		TRACE0("Failed to create toolbar\n");
    		return -1;      // fail to create
    	}
     
    	if (!m_wndStatusBar.Create(this) ||
    		!m_wndStatusBar.SetIndicators(indicators,
    		  sizeof(indicators)/sizeof(UINT)))
    	{
    		TRACE0("Failed to create status bar\n");
    		return -1;      // fail to create
    	}
     
    	// TODO: Delete these three lines if you don't want the toolbar to
    	//  be dockable
    	m_wndToolBar.EnableDocking(0);// en mettant cette caractéristique à zéro : empeche la boîte de s'accrocher
    					//CBRS_ALIGN_ANY);
    	EnableDocking(CBRS_ALIGN_ANY);
    	DockControlBar(&m_wndToolBar); // permet de défixer la barre
     
    	///////////////////////////////////////////////////////////////////////////////////////////
     
    	// création de la boîte flottante 1
    	if (CreateDlgBarTest() != 0)
    		return -1 ;
     
    	// création de la boîte flottante 2
    	if (Create2ndDglBar() != 0)
    		return -1 ;
     
    	return 0;
    }
     
    ....
     
    /////////////////////////////////////////////////////////////////////////////
    // gestion du menu VIEW pour afficher/enlever les boîtes flottantes
     
    //----------------------------------------------
    // gestion de la boîte ID_DLGBAR (m_dlgBarTest)
    //----------------------------------------------
    void CMainFrame::OnViewDlgbar() 
    {
    	// TODO: Add your command handler code here
    	if (m_dlgBarTest != NULL)
    	{
    		if (m_dlgBarTest->IsWindowVisible() != TRUE)
    		{
    			//la boîte a été fermée avec l'icône
    			// boîte flottante visible
    			DestroyDlgBarTest() ;
    			if (CreateDlgBarTest() != 0)
    				MessageBox("Impossible d'ouvrir la boîte flottante",NULL, MB_ICONERROR) ;
    		}
    		else
    		{
    			// boîte flottante cachée
    			DestroyDlgBarTest() ;
    		}
    	}
    	else
    	{
    		// boîte flottante visible
    		if (CreateDlgBarTest() != 0)
    			MessageBox("Impossible d'ouvrir la boîte flottante",NULL, MB_ICONERROR) ;
    	}
    }
     
    void CMainFrame::OnUpdateViewDlgbar(CCmdUI* pCmdUI) 
    {
    	// TODO: Add your command update UI handler code here
    	pCmdUI->SetCheck(NULL != m_dlgBarTest ? 1:0) ;
    	if (m_dlgBarTest != NULL)
    		pCmdUI->SetCheck(FALSE != m_dlgBarTest->IsWindowVisible() ? 1:0) ;
    }
     
    //----------------------------------------------
    // gestion de la boîte ID_DLGBAR_2ND (m_2ndDlgBar)
    //----------------------------------------------
    void CMainFrame::OnViewDlgbar2nd() 
    {
    	// TODO: Add your command handler code here
    	if (m_2ndDlgBar != NULL)
    	{
    		if (m_2ndDlgBar->IsWindowVisible() != TRUE)
    		{
    			//la boîte a été fermée avec l'icône
    			// boîte flottante visible
     
    			Destroy2ndDglBar() ;
    			if (Create2ndDglBar() != 0)
    				MessageBox("Impossible d'ouvrir la boîte flottante",NULL, MB_ICONERROR) ;
    		}
    		else
    		{
    			// boîte flottante cachée
    			Destroy2ndDglBar() ;
    		}
    	}
    	else
    	{
    		// boîte flottante visible
    		if (Create2ndDglBar() != 0)
    			MessageBox("Impossible d'ouvrir la boîte flottante",NULL, MB_ICONERROR) ;
    	}
    }
     
    void CMainFrame::OnUpdateViewDlgbar2nd(CCmdUI* pCmdUI) 
    {
    	// TODO: Add your command update UI handler code here
    	if (m_2ndDlgBar == NULL)
    		pCmdUI->SetCheck(0) ;
    	else
    		pCmdUI->SetCheck(FALSE != m_2ndDlgBar->IsWindowVisible() ? 1:0) ;
    }
     
     
    ////////////////////////////////////////////////////////////////////////////////////
    // création/destruction de la boîte de dialogue flottante de test
     
    //----------------------------------------------
    // création de la boîte ID_DLGBAR (m_dlgBarTest)
    //----------------------------------------------
    int CMainFrame::CreateDlgBarTest()
    {
    	m_dlgBarTest = new CTestMDI_DlgBar ;
     
            if (!m_dlgBarTest->Create(this, IDD_DLGBAR,
    	// collée à droite
    	CBRS_RIGHT | CBRS_GRIPPER |CBRS_TOOLTIPS | CBRS_FLYBY,//CBRS_HIDE_INPLACE,
    	IDD_DLGBAR))
    	{
    	TRACE0("Failed to create dialog bar m_wndDlgBar\n");
    	return -1;		// fail to create
    	}
    	// caractéristiques : se colle sur tous les bords de la fenêtre
    	m_dlgBarTest->EnableDocking(CBRS_ALIGN_ANY);
    	EnableDocking(CBRS_ALIGN_ANY);
    	DockControlBar(m_dlgBarTest);
     
    	CPoint point ;	// placée en flottante à 200,200 du coin en haut à gauche de l'écran
    	point.x = 200 ;
    	point.y = 200 ;
    	FloatControlBar(m_dlgBarTest,point); 
    	return 0 ;
    }
     
    //----------------------------------------------
    // destruction de la boîte ID_DLGBAR (m_dlgBarTest)
    //----------------------------------------------
    void CMainFrame::DestroyDlgBarTest()
    {
    	m_dlgBarTest->DestroyWindow() ; // détruit en mémoire
    	m_dlgBarTest = NULL ;
    }
    //------------------------------------------------------------------------------
     
    //----------------------------------------------
    // création de la boîte ID_DLGBAR (m_2ndDlgBar)
    //----------------------------------------------
    int CMainFrame::Create2ndDglBar()
    {
    	m_2ndDlgBar = new C2ndDlgBar ;
     
    	if (!m_2ndDlgBar->Create(this, IDD_DLGBAR_2ND,
    	// collée à droite
    	CBRS_BOTTOM | CBRS_GRIPPER |CBRS_TOOLTIPS | CBRS_FLYBY,//CBRS_HIDE_INPLACE,
    	IDD_DLGBAR_2ND))
    	{
    	TRACE0("Failed to create dialog bar m_wndDlgBar\n");
    	return -1;		// fail to create
    	}
    	// caractéristiques : se colle sur tous les bords de la fenêtre
    	m_2ndDlgBar->EnableDocking(CBRS_ALIGN_ANY);
    	EnableDocking(CBRS_ALIGN_ANY);
    	DockControlBar(m_2ndDlgBar);
    	return 0 ;
    }
     
    //----------------------------------------------
    // destruction de la boîte ID_DLGBAR (m_2ndDlgBar)
    //----------------------------------------------
    void CMainFrame::Destroy2ndDglBar()
    {
    	m_2ndDlgBar->DestroyWindow() ; // détruit en mémoire
    	m_2ndDlgBar = NULL ;
    }
    Avec ça, je lance bien une application MDI avec 2 boîtes de dialogues.
    Lorsque je ferme la boîte de dialogue m_dlgBarTest du menu ou de son icône, pas de problème tout ce passe correctement.

    La boîte m_2ndDlgBar quand à elle ne se ferme correctement qu'avec le clic sur son icône. Fermée ainsi, je peux la rappeler via View\Barre 2nd sans aucun problème.

    Par contre si j'essaie de la fermer via le menu, l'application plante....

    A priori le destroyWindow ne lui plaît pas. Pourquoi s'il ne lui plait pas, lorsque je ferme la boîte via l'icône et que je la rappelle via le menu tout ce passe bien alors qu'on utilise aussi destroyWindow ?

    Pourquoi n'y a t il aucun problème avec la boîte m_dlgBarTest qui est programmée exactement de la même manière pour la gestion de son affichage ?

    Merci encore pour l'aide

    Alice

  10. #10
    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,
    ou il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CMainFrame *pFrame=(CMainFrame *)GetParentFrame();		
    pFrame->ShowControlBar(&pFrame->m_DlgBar,TRUE,0);
    ça reaffiche la dialogbar ....
    donc tu peux oublier le sujet sur le pointeur de dialogbar le delete etc...
    quand tu fermes la dialogbar par la croix ,l"obet est encore valide graphiquement ,la commande showcontrolbar le reactive.


  11. #11
    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 youpi
    De retour dans une MDI avec une seule boîte flottante m_dlgBarTest,

    Pour gérer l'affichage ou non via le menu View\MyDlgBar, voici le contenu des fonctions liées à ce menu :
    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
     
    void CMainFrame::OnViewDlgbar() 
    {
    	// TODO: Add your command handler code here
     
            // test sur l'état visible/invisible de la boîte
    	if (m_dlgBarTest->IsWindowVisible() != TRUE) // elle est invisible
    	{       // on va rendre visible la boite
                    // c'est la fonction clé d'apparition disparition de la boîte
    		[b]ShowControlBar(m_dlgBarTest,TRUE,FALSE); [/b]
    	}
    	else [b]ShowControlBar(m_dlgBarTest,FALSE,FALSE);[/b] 
                     // on rend inivisble la boîte
    }
     
    void CMainFrame::OnUpdateViewDlgbar(CCmdUI* pCmdUI) 
    // fonction de mise à jour graphique du Menu View\MyDlgBar
    {
    	// TODO: Add your command update UI handler code here
            // si la boîte est visible, une coche est placée devant le menu VIEW\MyDlgBar
           // sinon on enlève cette coche
    	pCmdUI->SetCheck(FALSE != m_dlgBarTest->IsWindowVisible() ? 1:0) ;
    }
    Encore à Farscape pour ces précieux conseils !!!

    maintenant je réessaye avec non pas 1 mais 2 boîtes de dialogues.

    Alice

  12. #12
    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 suite et fin
    Bon même avec 2 boîtes flottantes ça marche du tonnerre !!!!

    Peut être pourrais tu le rajouter dans le post des CDialogBar de la FAQ ?

    Alice

  13. #13
    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,
    c'est deja en projet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/04/2008, 17h37
  2. Intégration d'une application MFC MDI dans une DLL
    Par AYARA Adel dans le forum MFC
    Réponses: 3
    Dernier message: 03/03/2008, 20h11
  3. [MFC]Impossible d'ouvrir une base access
    Par Sojiro dans le forum MFC
    Réponses: 2
    Dernier message: 13/07/2007, 23h18
  4. Réponses: 7
    Dernier message: 13/03/2006, 08h56
  5. Réponses: 3
    Dernier message: 27/09/2005, 08h44

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