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 averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    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
    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 averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    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
    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 averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    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
    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 averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    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 averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    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
    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 averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    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
    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 averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    20
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    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