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] Communication entre boite de dialogue et classe


Sujet :

MFC

  1. #1
    xr
    xr est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 15
    Points : 12
    Points
    12
    Par défaut [MFC] Communication entre boite de dialogue et classe
    Bonjour,

    Je suis confronte a un probleme recurent dont je n'ai pas la solution.
    Je cree une boite de dialogue avec une boite d'edition. (IDC_MYBOX), je lui affecte une variable de type controle (m_MyBox) m_Mybox.EnableWindow(WM_ENABLE), Ces operations fonctionnent avec toutes les fonctions membres (comme InitDialog()) de la classe BoxDialog derive de Dialog.

    Par contre, si j'essaie de modifier l'aspect de la boite a l'exterieur de la classe. Impossible. Par exemple dans la classe CAppliDoc, qui contient les codes relatifs aux menus, l'acces aux proprietes de la boite conduit invariablement a une erreur fatale. Impossible a contourner.
    J'ai tente de fabriquer une fonction membre public dans CBoxDialog, qui est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CBoxDialog::ActiveBoite()
    //permet l'activation de la boite de dialogue
    {
    	m_MyBox.EnableWindow(WM_ENABLE);
    }
    et de l'appeler dans le code principal de CAppliDoc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void CSectionBADoc::OnChoixSectionquelconque() 
    {
    	CMyBoxDialog aDlg;  	
    	aDlg.ActiveBoite();	
    	if (aDlg.DoModal() == IDOK)		 // l'affiche en mode modale
    	{
    	};
    }
    Mais ca plante violement a aDlg.ActiveBoite(), je me doute que c'est des histoires de pointeurs et de communications entre classe qui sont ne pas dans la meme branche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    erreur: Debug assertion failed
    	winocc.cpp
    	ligne 321
    D'avance merci pour tout deplantage
    xavier

  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
    bonsoir ,
    j'ai deja repondu a ce style de pb .
    http://www.developpez.net/forums/vie...ghlight=dialog
    regarde le context du post et surtout ma reponse finale sur l'acces a des controles en dehors de la classe.

  3. #3
    xr
    xr est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Suite
    Salut

    Merci pour tes remarques. J'ai lu tes solutions sur le probleme donné. Dans mon cas, le probleme est que la boite de dialogue appartient a la classe arborescente

    CBoxDialog/CDialog/CWnd/CCmdTarget
    et que l'appel local de la boite de dialogue appartient a la classe arborescente:

    CAppliDoc/CDocument/CCmdTarget
    Je vois bien que les deux convergent en CCmdTarget, mais je ne vois pas tres bien comment faire l'initialisation de la boite de dialogue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void CBoxDialog::ActiveBoite()
    //permet l'activation de la boite de dialogue
    {
    	m_MyBox.EnableWindow(WM_ENABLE);
    }
     
    void CAppliDoc::OnChoixSectionquelconque() 
    {
    	CMyBoxDialog aDlg(????);  	
    	aDlg.ActiveBoite();	
    	if (aDlg.DoModal() == IDOK)		// l'affiche en mode modale
    	{
    	};
    }
    car si je mets this, ca pointe logiquement sur une classe CDocument qu'il ne sait pas convertir en CWnd a l'initialisation. J'ai tente de rajouter dans la classe CMyBoxDialog un pointeur de type CWnd* qui est initialise avec InitDialog. Puis je recupere ce pointeur sous CApplicDoc mais ca plante encore.

    Par contre, ce n'est peut etre pas une bonne idee de modifier dans la classe CAppliDoc, faut il faire autrement ?

    D'avance merci
    xavier

  4. #4
    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 bonsoir,
    tout d'abord une petite correction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // m_MyBox.EnableWindow(WM_ENABLE); 
    m_MyBox.EnableWindow(TRUE);  // ou FALSE
    voir doc MSDN:
    BOOL EnableWindow( BOOL bEnable = TRUE );
    WM_ voulant dire windows Messages.....
    c'est sur que ça fonctionne parce que ton WM_ENABLE est > 0 mais bon ....
    tu n'est pas oblige de fournir un parent à ta dialogue voir definition
    du constructeur d'une CDialog:
    CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
    si le pointeur est null c'est la fenetre d'application qui est parent ...
    et si tu a bien lu ce que j'ai dis tu ne peux changer les attributs windows d'un controle qui n'existe pas encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aDlg.ActiveBoite();  // pas bon ça va planter.
    on peux resumer ainsi :
    il n'a y a pas ou plus de "vie " graphique des controles et de la fenetre avant et apres le DoModal() d'une CDialog.
    toute tentative se soldera par une exeption .

  5. #5
    xr
    xr est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Suite et faim...
    Re, bonsoir,

    J'ai finalement compris (meuh on me).

    J'ai donc tout change, j'ai declare une variable de type WORD que j'initialise a WM_ENABLE quand je veux activer la boite d'edition, et dans le initdialog de la classe j'ai un test qui lance la fonction voulue.

    Le probleme etait donc bien dans l'inexistence de l'objet graphique avant le DoModal().

    Merci pour ce tuyau, farscape.
    xavier

  6. #6
    xr
    xr est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci pour ces tuyaux.

    @+
    xavier

  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,
    tu fais ce que tu veux mais n'itialise pas une variable à WM_ENABLE mais à TRUE ;
    Relis ce que j'ai dis un jour ou l'autre ça va te jouer des tours
    du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    m_bIsEnable=WM_ENABLE; // #define WM_ENABLE                       0x000A voir winuser.h
    if( m_bIsEnable==TRUE)  // un walou aerien ! le test echoue puisque m_bIsEnable==WM_ENABLE
    {
     
    }

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

Discussions similaires

  1. communication entre boites de dialogue
    Par ellipse2v dans le forum MFC
    Réponses: 2
    Dernier message: 17/07/2007, 12h05
  2. Réponses: 8
    Dernier message: 15/05/2006, 15h54
  3. Réponses: 3
    Dernier message: 22/11/2005, 11h12
  4. [MFC] Personnaliser sa boite de dialogue
    Par Guybrush113 dans le forum MFC
    Réponses: 16
    Dernier message: 05/05/2004, 11h03
  5. [MFC] rendre une boite de dialogue inactive
    Par Vestaproman dans le forum MFC
    Réponses: 8
    Dernier message: 22/01/2004, 14h09

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