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 :

liaison entre une vue SDI et Boite de dialogue non-modale


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut liaison entre une vue SDI et Boite de dialogue non-modale
    Bonjour,
    Voici mon problème. J’ai créé une application SDI. Ma classe dérivée de CView affiche dans la zone client des objets générés avec OpenGL. Cette classe gère les évènements souris et clavier qui modifient les objets affichés.
    J’affiche une boîte de dialogue non-modale qui doit communiquer avec ma vue dans les deux sens :
    - les évènements souris et clavier modifient les contrôles de la boîte,
    - les contrôles de la boîte modifient les objets affichés.
    Je gère le premier sens en gardant dans ma vue le pointeur vers la boîte de dialogue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    simBaseDlg = new CDialogSimBase(this);
    simBaseDlg->Create(IDD_DIALOG_SIM_BASE);
    Mon problème est de récupérer dynamiquement la modification des contrôles de la boîte de dialogue pour modifier mon dessin. J’ai essayé :
    - de mettre dans ma classe « CDialogSimBase » un pointeur de fonction qui pointerait vers une fonction de ma classe Vue mais ça ne fonctionne pas. J’ai un conflit au moment de la compilation avec une histoire de __cdecl que je n’ai pas réussi à gérer,
    - d’utiliser les messages privés. J’ai trouvé une explication très complète sur le site mais je n’ai pas réussi à l’appliquer dans mon cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Dans l’include de CDialogSimBase
    #define WM_TEST WM_USER+100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Dans CDialogSimBase je veux que la fermeture de la boîte génère un message
    void CDialogSimBase::OnClose() 
    {
    	this->GetParent()->PostMessage(WM_TEST);
    	CDialog::OnClose();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Dans l’include de ma vue
    // Generated message map functions
    protected:
    	//{{AFX_MSG(CTest_oglView)
    	afx_msg void OnDestroy();
    	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    	afx_msg void OnSize(UINT nType, int cx, int cy);
    	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    	afx_msg void OnViewSimBase();
    	//}}AFX_MSG
    	long OnReceiveTest(WPARAM wparam, LPARAM lparam);
    	DECLARE_MESSAGE_MAP()
    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
     
    //Dans ma vue
    BEGIN_MESSAGE_MAP(CTest_oglView, CView)
    	//{{AFX_MSG_MAP(CTest_oglView)
    	ON_... messages divers
    	//}}AFX_MSG_MAP
    	// Standard printing commands
    	ON_COMMAND… messages divers
    	ON_MESSAGE(WM_TEST, OnReceiveTest)
    END_MESSAGE_MAP()long CTest_oglView::OnReceiveTest(WPARAM wparam, LPARAM lparam)
    {
    	MessageBox("Message de fermeture");
    	return 0L;
    }
    J’insiste sur cette manière car elle me paraît coller d’avantage avec le concept de programmation Windows. Mais peut-être que je me trompe. J’ai l’impression que je cherche compliqué alors que ça devrait être simple de récupérer des données issues d’une boîte de dialogue, non ? Merci d’avance pour le coup de main.

    EDIT PetitPapaNoël : Merci de penser aux balises CODE (bouton #) pour une meilleure lisibilité...

  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,
    pourquoi ne pas mettre un pointeur de ta view dans ta boite de dialogue ?
    il suffira ensuite d'appeler la méthode appropriée dans la view par l'intermédiaire du pointeur..

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    En fait j'ai déjà essayé ça avant les pointeurs de fonction. Mais inclure dans ma vu l'include de la boite de dialogue et inclure dans la boite de dialogue l'include de ma vue génère des erreurs à la compilation que je ne maitrise pas.
    Effectivement ce système me paraissait plus simple même si l'utilisation des messages m'apparaissait une solution "élégante".
    Pour le moment j'en suis au même point puisque je ne peux pas déclarer dans la boîte le pointeur vers ma vue.

  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
    je me doutais un peu de ce probléme.. qui n'en est pas un .
    il faut pré déclarer le pointeur dans la classe:
    voir faq:
    http://cpp.developpez.com/faq/vc/?pa...#PbWithHeaders

    sinon au pire tu déclares un pointeur sur une CFormiew.
    et tu castes le pointeur sur le nom de ta classe au moment de l'utilisation..

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Problème résolu.
    En fait c'est une solution intermédiaire qui fonctionne même si cela laisse beaucoup de question en suspens :
    Dans ma boîte de dialogue je déclare :
    puis lorsque la boîte de dialogue se ferme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CDialogSimBase::OnClose() 
    {
    	pVue->SendMessage(WM_TEST);
    	CDialog::OnClose();
    }
    Je l'ai même amélioré en récupérant dans le constructeur la fenêtre parent.

    J'ai malgré tout un soucis avec l'intégralité de la solution que vous m'avez proposé :
    Comment caster le pointeur dans la boîte de dialogue (donc sans passer par SendMessage) alors que je n'ai pas inclus l'entête de ma vue. Car en fait les macros #ifndef sont déjà inclus dans le code par MFC. C'est étrange que la récupération des données d'une boîte de dialogue soit aussi peu intuitif (j'ai l'impression que c'est le problème de MFC en général).
    Dans tous les cas, j'ai une solution, merci beaucoup

  6. #6
    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
    c'est toi qui te complique la vie ...
    si tu disposes du pointeur sur la vue tu peux appeler directement la méthode concernée dans la view.

    si ma vue se nomme CMyView on fera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static_cast<CMyView *>(pVue)->MaMethode();

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Je dois être un peu bouché aujourd'hui. Je viens de tester le casting suivant dans ma boîte de dialogue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CDialogSimBase::OnClose() 
    {
    	static_cast<CTest_oglView *>(m_pParent)->TestReception();
    	CDialog::OnClose();
    }
    avec m_pParent un Wnd* qui pointe vers mon instance de CTest_oglView.
    comme je n'ai pas inclus "test_oglView.h" j'ai une erreur de compilation :
    syntax error : identifier 'CTest_oglView'
    Et quand je l'inclus, je me retrouve avec une inclusion croisé et c'est le boxon. Il y a quelque chose qui m'échappe. Je ne suis pas loin mais il y a quelque chose qui doit m'échapper.
    En tout cas merci pour ces précieuses informations.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    ERRATUM !
    Le problème ne vient peut-être pas de là. Ma classe CTest_oglView a disparu de l'onglet ClassView, j'ai dû faire une fausse manip. J'essaie de la récupérer.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    c'est l'objet du post de la faq sur les références croisées:
    dans le .h de ta classe formview tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    class CDialogSimBase;
    class CTest_oglView : public CFormView
    {
    ///............
    CDialogSimBase *m_pDialog; // pas de probléme c'est pré déclaré.
    };
    dans le .cpp de la formview en dessous de l'include correspondant à la classe CTest_oglView tu rajoutes l'include de la boite de dialogue.

    dans la classe de la boite de dialogue tu peux mettre un pointeur sur la view (CTest_oglView) dans le .cpp de la boite de dialogue tu mets l'include de la view avant celui de la boite de dialogue.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Je viens de faire ce que tu me dis et effectivement je n'avais pas compris le principe de la pré-déclaration. J'ai suivi tes explicatons et quand je compile le .cpp de la boite de dialogue il me renvoie trois erreurs de compilation dans l'include de la View, alors qu'il n'y a visiblement aucun problème :
    error C2143: syntax error : missing ';' before '*'
    error C2501: 'CTest_oglDoc' : missing storage-class or type specifiers
    error C2501: 'GetDocument' : missing storage-class or type specifiers

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    hé bien il manque l'include relatif a la classe document.
    tu dois avoir dans ta dialogue non seulement le l'include de la view mais aussi ceux qui en dependent... (les mêmes que tu as dans le .cpp de ta view).

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Impeccable !
    Ca marche très bien. Je n'aurais jamais pensé à faire ça tout seul. Merci

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

Discussions similaires

  1. [XL-2010] Boite de dialogue non modale propre à sa feuille
    Par RicardoBxl dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 29/11/2010, 18h08
  2. Boite de dialogue non modale
    Par Orc_Fayeh dans le forum MFC
    Réponses: 4
    Dernier message: 19/02/2007, 22h25
  3. Afficher/Cacher Boite de dialogue non modale
    Par coco21 dans le forum MFC
    Réponses: 5
    Dernier message: 06/01/2007, 10h08
  4. Boite de dialogue non modale
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 25/12/2006, 21h46
  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