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]Child vs popup


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut [MFC]Child vs popup
    Dans la fenetre principale de mon application, il ya un tabctrl qui permet d'afficher 3 dialogs que j'ai créées a partir des ressources. Dans l'un de ces dialogs, un bouton permet d'afficher une dialog grace a la fonction suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CMyTabDlg::OnBtn() 
    {	 
            CJobSplittingDlg dlg(this);
    	dlg.DoModal();
    }
    ce type de fonction marche quand la dialog qui contient celui ci a le style popup, mais ne fonctionne pas lorquelle a le style child.

    Comment puis je faire?? Merci d'avance

    PS : je ne sais pas si j'ai été clair. Je détaillerai si non.

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    Au vu du nombre de réponses j'en conclue que je n'ai pas été clair du tout... Je vais donc essayer de résumer mon probleme.

    La fenetre principale de mon application contient un TabCtrl permettant d'afficher 3 dialogs créées dans les ressources. J'aimerai, à partir de l'une d'entre elles, ouvrir une dialog modal. Ca marche si la fenetre (celle qui contient le Do modal) est de type popup, mais pas qd elle est de type child...

    Je comprends pas pourquoi. Quelqu'un aurait il une explication??


    Merci d'avance

    PS : Autre question : Existe-t'il une autre méthode pour ouvrir une dialog a partir d'une autre qu'en faisant un DoModal, parce qu'il y a certaines de mes dialogs que j'aimerai pouvoir ouvrir tout en conservant la possibilité de revernir a la fenetre parente sans avoir a les fermer...

  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,
    l'attribut d'une Dialog c'est popup ,pour une view c'est child ..

    pour une dialogue non modale voir faq:
    http://c.developpez.com/faq/vc/?page...gPostNcDestroy

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    Merci pour ta réponse Farscape. Néanmoins, je n'ai pas compris ce que tu écris concernant dialog et view (je débute)... Pourquoi le Do Modal ne marcherait pas lorsqu'il est appelé depuis une view??

    Pour ce qui concerne la dialogue non modale, ca marche, mais j'ai encore deux questions :

    - quelle fonction utiliser pour remettre la fenetre principale de l'application au premier plan lorsqu'on clique dessus??(un truc du genre AfxGetMainWnd()->BringWindowToTop() je crois mais ou il faut le mettre pour que ca soit appelé lorsque on clique sur celle ci)

    - comment faire pour que la fenetre non modale ouverte apparaisse dans la barre des taches??

  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
    Citation Envoyé par benahpets
    Merci pour ta réponse Farscape. Néanmoins, je n'ai pas compris ce que tu écris concernant dialog et view (je débute)... Pourquoi le Do Modal ne marcherait pas lorsqu'il est appelé depuis une view??

    Pour ce qui concerne la dialogue non modale, ca marche, mais j'ai encore deux questions :

    - quelle fonction utiliser pour remettre la fenetre principale de l'application au premier plan lorsqu'on clique dessus??(un truc du genre AfxGetMainWnd()->BringWindowToTop() je crois mais ou il faut le mettre pour que ca soit appelé lorsque on clique sur celle ci)

    - comment faire pour que la fenetre non modale ouverte apparaisse dans la barre des taches??
    j'ai pas dis ça ,j'ai dis qu'une boite de dialogue doit avoir le style popup et non child utilisé avec la classe CFormView.


  6. #6
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    Oui mais si je mets le style popup, ma dialog correspondant a chaque tab n'apparait pas dans la fenetre principale de l'appli. (j'ai fait un projet Dialog based) Il faut que je mette child pour que ca marche comme je veux. Y a t'il une raison pour que le do modal ne marche pas lorsque le style déclaré est child??

    Est ce que qqn aurait une idée concernant mes deux autres questions??

  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
    Par défaut
    aaarh j'avais zappé un bout ,
    alors on reprend :
    tout ce que j'ai dis est bon .
    le style child doit etre mis aussi sur un panneau d'un tabcontrol .
    mais sur le panneau d'un tabcontrol on ne fait pas de DoModal ......
    c'est le tabcontrol qui se charge d'initialiser le panneau .



  8. #8
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    Manifestement je ne suis toujours pas clair

    Mon Tab control marche parfaitement (je ne fais pas de DoModal), mais dans l'un des panneaux de celui ci, il y a un bouton qui permet normalement l'affichage d'une fenetre.

    Avant de mettre le TabControl, le bouton (appelant un domodal) marchait mais maintenant que ma fenetre est dans le tabcontrol ca marche plus...


    C'est meiux expliqué???

  9. #9
    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
    Citation Envoyé par benahpets
    Manifestement je ne suis toujours pas clair

    Avant de mettre le TabControl, le bouton (appelant un domodal) marchait mais maintenant que ma fenetre est dans le tabcontrol ca marche plus...
    C'est meiux expliqué???
    on va y arrivé lol ,

    il n' y a pas de probleme particulier a faire apparaitre une boite de dialogue modale dans le panneau d'un tabcontrol.
    pour bien preciser le truc tu cherches a faire apparaintre une boite de dialogue modale a partir d'un des panneaux de ton tabcontrol ? c'est bien ça ?
    cette boite de dialogue doit avoir le style popup .
    je ne vois pas ou est le probleme .


  10. #10
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    Cool on s'est compris

    Je crois que je viens d'isoler le problème...

    Ca vient bien du fait que le style soit child car je viens d'essayer de remettre popup et la ca marche (pour la fenetre du tabcontrol contenant le fameux bouton)

    En fait ca plante lors de la fonction Oninitdialog de ma popup (celle liée au bouton) je te mets le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BOOL CpopupDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
     
            bla bla ...
     
    	FILE *pFile;
    	CTabDlg1Dlg *pDlg=( CTabDlg1Dlg *)GetParent();
    	CString lPath = pDlg->m_selectedFilePathName;      <--- ca plante la
    	rsetFile = fopen(lPath,"r");
    ...
    }

    en fait je dois récupérer l'info m_selectedFilePathName dans le panneau du tab control..
    Le getparent n'a pas l'air de marcher quand le style est child ... : : :

  11. #11
    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
    Citation Envoyé par benahpets
    Cool on s'est compris

    Je crois que je viens d'isoler le problème...

    Ca vient bien du fait que le style soit child car je viens d'essayer de remettre popup et la ca marche (pour la fenetre du tabcontrol contenant le fameux bouton)

    En fait ca plante lors de la fonction Oninitdialog de ma popup (celle liée au bouton) je te mets le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BOOL CpopupDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
     
            bla bla ...
     
    	FILE *pFile;
    	CTabDlg1Dlg *pDlg=( CTabDlg1Dlg *)GetParent();
    	CString lPath = pDlg->m_selectedFilePathName;      <--- ca plante la
    	rsetFile = fopen(lPath,"r");
    ...
    }

    en fait je dois récupérer l'info m_selectedFilePathName dans le panneau du tab control..
    Le getparent n'a pas l'air de marcher quand le style est child ... : : :
    bon ça approche ...
    CTabDlg1Dlg c'st quoi c'est le panneau d'ou l'appel est fait ?
    GetParent sera valide si lors de la construction tu lui a passé le parent ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CpopupDlg Dlg(this); // this ==CTabDlg1Dlg

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    GetParent sera valide si lors de la construction tu lui a passé le parent ...
    Code:

    CpopupDlg Dlg(this); // this ==CTabDlg1Dlg
    Ca marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CpopupDlg ::CpopupDlg (CWnd* pParent /*=NULL*/)
    	: CDialog(CpopupDlg ::IDD, pParent)
    {
    	CpopupDlg Dlg(this); // this ==CTabDlg1Dlg
     
    }

    CTabDlg1Dlg est bien le panneau d'ou l'appel est fait...

  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
    Par défaut
    Citation Envoyé par benahpets
    GetParent sera valide si lors de la construction tu lui a passé le parent ...
    Code:

    CpopupDlg Dlg(this); // this ==CTabDlg1Dlg
    Ca marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CpopupDlg ::CpopupDlg (CWnd* pParent /*=NULL*/)
    	: CDialog(CpopupDlg ::IDD, pParent)
    {
    	CpopupDlg Dlg(this); // this ==CTabDlg1Dlg
     
    }
    CTabDlg1Dlg est bien le panneau d'ou l'appel est fait...
    ouch c'est pas ça que j'ai dis lol..
    quelque part tu dois avoir ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CTabDlg1Dlg::OnButtonMachin() // c'est un exemple bien sur ...
    {
    	CpopupDlg Dlg(this); // this ==CTabDlg1Dlg
           Dlg.DoModal();
    }

  14. #14
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    J'avais compris dans le constructeur de la Fonction...

    Mais j'avais effectivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CTabDlg1Dlg::OnButtonMachin() // c'est un exemple bien sur ...
    {
       CpopupDlg Dlg(this); // this ==CTabDlg1Dlg
           Dlg.DoModal();
    }
    Ca ne marche pas quand meme

  15. #15
    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
    aarf c'est pas possible ,
    montre moi le code de ton appel .


  16. #16
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BOOL CpopupDlg::OnInitDialog()
    {
       CDialog::OnInitDialog();
     
            bla bla ...
     
       FILE *pFile;
       CTabDlg1Dlg *pDlg=( CTabDlg1Dlg *)GetParent();
       CString lPath = pDlg->m_selectedFilePathName;      <--- ca plante la
       rsetFile = fopen(lPath,"r");
    En fait c'est le pDlg qui renvoie la mauvaise fenetre : lorsque le style du panneau du tab control est popup, la fenetre renvoyée est CTabDlg1Dlg. Par contre lorsque le style est child pDlg renvoie :
    pDlg = 0x0012fc54 {CMainDlg hWnd=???}

    où MainDlg est la dialog contenant le TabControl

    Je pense donc que ce n'est pas getParent qu'il faut utiliser

    PS: je te remercie vraiment de passer tout ce temps à m'aider

  17. #17
    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
    bon le panneau du tabcontrol doit etre child ...
    montre moi l'appel de la dialogue avec DoModal avec le contexte d'appel
    (la fonction dans lequel est placé ce code ).

  18. #18
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CJobQueueDlg::OnJobSplitting() 
    {
    	CJobSplittingDlg dlg(this);
    	dlg.DoModal();
    }
    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
    BOOL CJobSplittingDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
     
    	m_pBoldFont2 = new CFont;
    	m_pBoldFont2->CreateFont(14,0,0,0,FW_BOLD,0,0,0,0,0,0,ANTIALIASED_QUALITY,0,"Arial");
    	m_frameSplitting.SetFont(m_pBoldFont2);
    	m_frameSplitting.SetColor(RGB(95,95,95));
    	m_frameSplitting.SetGradientColor(RGB(95,95,95));
     
    	m_setInformation.SetFont(m_pBoldFont2);
    	m_setInformation.SetColor(RGB(95,95,95));
    	m_setInformation.SetGradientColor(RGB(95,95,95));
     
    	m_startFrameText.SetFont(m_pBoldFont2);
    	m_endFrameText.SetFont(m_pBoldFont2);
     
     
    	FILE *rsetFile;
    	CJobQueueDlg *pDlg = ( CJobQueueDlg *) GetParent();
    	CString lPath = pDlg->m_selectedRsetFilePathName;
    	rsetFile = fopen(lPath,"r");
     
    	m_startFrame.SetWindowText(CRendersetParser::getStartFrame(rsetFile));
    	m_endFrame.SetWindowText(CRendersetParser::getEndFrame(rsetFile));
     
     
    	UpdateData(FALSE);
    	m_splitMode.SetCurSel(0);
     
    	// on initialise le spinCtrl
    	m_countSpin.SetRange(0,100);
    	m_countSpin.SetPos( 0 );
    	m_countEdit.SetWindowText( "0" );
     
     
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    Voila les deux fonctions qui posent probleme

    La dialogue principale de l'application, qui contient le TabControl s'appelle InterfaceDlg
    Le panneau en question du TabCtrl s'appelle CJobQueueDlg
    et la popup a afficher s'appelle CJobSplittingDlg

  19. #19
    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
    fait afficher l'adresse des parents comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void CJobQueueDlg::OnJobSplitting()
    {
      TRACE("\nParent Reel:%X",(unsigned int)this);
       CJobSplittingDlg dlg(this);
       dlg.DoModal();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     FILE *rsetFile;
       CJobQueueDlg *pDlg = ( CJobQueueDlg *) GetParent();
      TRACE("\nParent Obtenu:%X",(unsigned int)pDlg);
       CString lPath = pDlg->m_selectedRsetFilePathName;
       rsetFile = fopen(lPath,"r");
    le resultat apparait dans le panneau debug.
    les adresses sont identiques ?
    pour moi ce code est correcte .

  20. #20
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 116
    Par défaut
    Les deux adresses sont différentes... C'est mauvais signe?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [ MFC ] Menu popup
    Par Denn's dans le forum MFC
    Réponses: 12
    Dernier message: 09/07/2007, 16h12
  2. mfc popup au pointage de souris
    Par pada51 dans le forum MFC
    Réponses: 2
    Dernier message: 04/05/2007, 12h21
  3. [MFC] Creation d'un thread pour un popup d'attente
    Par firejocker dans le forum MFC
    Réponses: 8
    Dernier message: 07/02/2006, 09h15
  4. [MFC] Fermer les Popup, mais pas l'appli
    Par Grey dans le forum MFC
    Réponses: 4
    Dernier message: 16/11/2005, 20h30
  5. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57

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