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]gérer les controles d'une dialog box à l'autre


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut [MFC]gérer les controles d'une dialog box à l'autre
    Bonjour,

    J'ai un petit problème avec la gestion de mes controles entre mes boites de dialogues.

    J'ai une boite de dialog1, qui ouvre une boite de dialog2. cette dialog2 est une boite de dialogue avec un mot de passe pour ouvrire une boite de dialog3, qui contient mes controles de règlage de mon application.

    J'ai décider d'avoir le choix de passer directement de la dialog1 à la dialog3 (appui sur ctrl+d) sans avoir à rentrer le mot de passe.

    Dans la dialog3 j'ai deux checkboxes qui me permette de valider ou non des traitement appartenant à ma dialog1.

    Mon problème vient du fait que si je passe directement de dialog1 à dialog3 et que je modifie les controles, il sont bien pris en compte dans la dialog1, alors que si par la suite je passe par la dialog2 (mot de passe) et que je veux modifier mes controles de la dialog3, il ne sont pas pris en compte dans la dialog1.

    Pour passer mes variable de la dialog3 à 1, j'utilise :
    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
     
    void Cdialog3::OnOK()
    {
    Cdialog1 *pDlg=(CDialog1 *)GetParent();
     
    	UpdateData(TRUE);
     
           if(IsDlgButtonChecked(IDC_CHECK_IMG_ORIG))
    		{
    			pDlg->m_checkboxe1=true;
     
    		}
    		else
    		{
    			pDlg->m_checkboxe1=false;
     
    		}
     
    CDialog::OnOK();
    Je pense que quand je fais Dlg.DoModal dans ma dialog1 et que je passe directement dans la dialog3 il n'y a pas de soucis, mais quand je passe par le dialog2, comme il y a une fenêtre intermédiaire(dialog2), mes variable n'atteignent pas ma dialog1.

    Comment pourrais-je tester si la Dialog3 est appelé par la dialog1 ou la dialog2 pour connaitre la fenêtre parent ? et comment je fais pour passer mes variable de la dialog3 à la dialog2 pour qu'elle les passent à la dialog1?

    Tous ça à l'air très compliqué pour un oeil extérieur, mais il suffit de m'expliquer comment communiqué entre boites de dialogues avec des intermédiaires ou directement (quelle est la dialog parent).

    Désoler pour ses explications sur le tas, mais c'est le plus clair que je puisse faire. Si vous avez des questions, ne vous génez pas.

    Merci pour ceux qui feront l'effort de comprendre mon problème et de me donner un petit coup de pouce.

  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
    salut,
    Certes c’est un peu compliqué à suivre lol …
    Mais bon le principe reste le même que celui indiqué par la faq.
    http://c.developpez.com/faq/vc/?page...apOnOKOnDialog

    Le plus simple étant d’avoir systématiquement des variables associées aux contrôles.
    Avant l’appel d’une boite susceptible de modifier les contrôles de son parent il faut faire un UpdateData(TRUE) ;
    Appeler la boite de dialogue (DoModal).
    Celle-ci touche éventuellement aux variables de la dialogue parent comme tu l’as fait par l’intermédiaire de GetParent().
    En sortie si DoModal() ==IDOK il suffira de faire un UpdateData(FALSE) pour remettre a jour éventuellement les contrôles dont les données ont été modifiées par la dialogue fille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CDlg1::OnCallDlg2()
    {
     UpdateData(TRUE) ;
     Dlg2 dlg(this) ;
     if(dlg.DoModal()==IDOK) UpdateData(FALSE);
    }
    void Dlg2 ::OnOK()
    {
       UpdateData(TRUE) ;
       CDlg1 *pParent=static_cast<CDlg1 *>(GetParent());
       pParent->m_strEdit=m_strEdit; // etc…
       CDialog ::OnOk() ;
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    merci pour ces explications,

    mais il reste tjrs un petit soucis: (je vais essayé d'être clair)

    Voila comment j'appel, à l'aide d'une Cdialog1, soit m'a Cdialog2 (mot de passe pour appelé Cdialog3), soit j'appel directement Cdialog3 (avec appui de ctrl+d):

    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
     
    void CDlg1::OnBnClickedParametre()
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
     
    	SHORT Mask = 32768;
    	bool test1, test2;
     
    	if((GetKeyState(VK_CONTROL) & Mask) && (GetKeyState('D') & Mask))
    	{
                    UpdateData(TRUE);
                    CDlg3 Dlg3(this);
                    Dlg3.m_checkB1 = m_checkboxe1;
    		Dlg3.m_checkB2 = m_checkboxe2;
                    if(Dlg3.DoModal()==IDOK) UpdateData(FALSE); 
    	}
    	else
    	{
    		UpdateData(TRUE);
                    CDlg2 Dlg2(this);
    		Dlg2.m_tempCheckB1 = m_checkboxe1;
    		Dlg2.m_tempCheckB2 = m_checkboxe2;
    		if(Dlg2.DoModal()==IDOK) UpdateData(FALSE);
    	}
     
    	PostMessage(WM_PAINT);
     
    }
    Le but de se bout de code est d'appeler une Cdialog3 qui change des paramètres d'origines du programme, mais pour éviter l'inconvéniens de taper tjrs le mot de passe dans le cas de réglage test, on peut passer directement au réglages paramètres de Cdialog3 (touche ctlr+p, mais c une combine secrete!! shut!! )

    mais pour que les changements soit garder durant le temps ou l'application est ouverte, j'initialise mes controles sur la Cdialog1 et je les passent en paramètres à Cdialog2 puis à Cdialog3 (dans le cas du passage par mot de passe) ou directement à Cdialog3 (ctrl+p)... jusque là c clair j'espère?

    voila le code de Cdialog2:
    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
     
     
    void Cdlg2::OnBnClickedOk()
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
     
    	CString motDePasse;
     
    	m_ContoleMotPasse.GetWindowText(motDePasse);
     
    	if(motDePasse == "xxxxxx")
    	{
    		UpdateData(TRUE);
    		Cdlg3 Dlg3(this);
    		Dlg3.m_checkB1 = m_tempCheckB1;
    		Dlg3.m_checkB2 = m_tempCheckB2;
    		if(Dlg3.DoModal()==IDOK) UpdateData(FALSE);
    	}
    	else
    	{
    		MessageBox("Le mot de passe est incorrect... même joueur joue encore !!","ERREUR TRY AGAIN !!",MB_OK | MB_ICONEXCLAMATION);
    	}
     
    	OnOK();
     
    }
    Ce code permet d'empêcher n'importe qui de changer les paramètres du logiciel de test. je n'est rien ajouté à la fonction OnOK().

    Voici le code de la Cdialog3:
    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
     
     
    void Cdlg3::OnOK()
    {
    	// TODO : ajoutez ici votre code spécialisé et/ou l'appel de la classe de base
     
    	UpdateData(TRUE) ;
    	Cdlg1 *pDlg1=static_cast<CDlg1 *>(GetParent());
     
    	if(IsDlgButtonChecked(IDC_CHECK_IMG_ORIG))
    	{
    		pDlg1->m_checkboxe1=true;
     
    	}
    	else
    	{
    		pDlg1->m_checkboxe1=false;
     
    	}
     
    	if(IsDlgButtonChecked(IDC_CHECK_IMG_PROC))
    	{
    		pDlg1->m_checkboxe2=true;
     
    	}
    	else
    	{
    		pDlg1->m_checkboxe2=false;
     
    	}
     
    	CDialog::OnOK(); 
    }
    Ce code vérifie les états de mes deux checkBoxes et doit renvoyer les états de celles-ci à la Cdialog1 pour savoir si certaines actions doivent se faire ou non.

    Donc se qui ne va tjrs pas: si je passe par la méthode ctrl+p, mes paramètres sont bien renvoyés dans ma Cdialog1, mais qd je passe par la méthode avec mot de passe, mes paramètres n'atteignent pas Cdialog1. J'ai pensé à faire un test pour savoir si la Cdialog qui appelle Cdialog3 est la Cdialog1 ou la Cdialog2, pour pouvoir choisir qui sera la fenetre parente et ainsi remonter mes paramètres de Cdialog en Cdialog, mais je ne connais pas le moyen de savoir qui est la Cdialog parente!!

    Alors qui est-ce qui n'a pas compris???

    J'espère que la lecture vous à été agréable et que votre voyage c'est bien déroulé... MAINTENANT J'APPEL A L'AIDE!!!! Houston, on à un problème...

    merci!!

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    Bon j'ai essayé un truc mais ça ne compile pas...

    Ce que j'ai fais:

    j'ai rajouté une variable à ma Cdialog3 "m_parent", et si je passe de ma Cdialog1 à Cdialog3 je lui donne une valeur '1'. Si par contre, c'est la Cdialog2 (mot de passe) qui appel ma Cdialog3, je lui attribut une valeur '2'.

    Du coup dans la fonction OnOK() de ma Cdialog3 je test si m_parent =1 ou 2, si c 1, je fais ce que je faisait avant. Si c 2, on compile ce code:

    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
     
     
    if(m_parent == 2)
    	{
    		UpdateData(TRUE) ;
    		Cdlg2 *pDlg=static_cast<Cdlg2 *>(GetParent());
     
    		if(IsDlgButtonChecked(IDC_CHECK_IMG_ORIG))
    		{
    			pDlg->m_tempCheckB1=true;
    		}
    		else
    		{
    			pDlg->m_tempCheckB1=false;
    		}
     
    		if(IsDlgButtonChecked(IDC_CHECK_IMG_PROC))
    		{
    			pDlg->->m_tempCheckB2=true;	
    		}
    		else
    		{
    			pDlg->->m_tempCheckB2=false;
    		}
    	}
    Ce code me sert à transférer des valeur tempo de ma Cdialog3 à ma Cdialog2 pour ensuite les envoyer dans ma Cdialog1.

    mais le compilateur n'est pas d'accord avec moi, il dit que mon pointeur sur la Cdialog2 n'est pas bon:

    Cdlg2 : identificateur non déclaré
    pDlg : identificateur non déclaré
    erreur de syntaxe : identificateur 'Cdlg2'
    pourtant cette classe existe bien!! et il n'y a pas d'erreur de frappe.



    Se peut-il que l'on ne puisse pas déclarer deux fois une Cdialog comme fille?

    Une suggestion?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/04/2010, 18h01
  2. Colorier les controles d'une DLG
    Par tonycalv dans le forum MFC
    Réponses: 7
    Dernier message: 11/01/2008, 08h48
  3. Réponses: 4
    Dernier message: 13/07/2007, 11h12
  4. Pop-up d'une dialog box a partir d'un bouton
    Par bobbyjack dans le forum MFC
    Réponses: 21
    Dernier message: 13/09/2005, 15h32
  5. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

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