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 :

r�cup�rer un pointeur sur une classe qui h�rite de CView


Sujet :

MFC

  1. #1
    Membre confirm�
    Inscrit en
    Mars 2005
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par d�faut r�cup�rer un pointeur sur une classe qui h�rite de CView
    Bonjour,

    je me demandai s'il est possible de r�cup�rer un pointeur sur une classe qui h�rite de CView au niveau de la classe de l'application (celle qui h�rite de CWinApp).

    J'ai d�j� vu dans les faq qu'on pouvait r�cup�rer un pointeur sur une CView (pour parcourir toutes les view), mais je ne vois pas comment faire pour les classes qui en h�ritent.

    Pourriez-vous m'�clairer?

  2. #2
    Membre chevronn�
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par d�faut
    Ben si ta classe h�rite de CView, tu fait un
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    this->GetNextView(ViewPos);
    dans ton doc et apres tu caste ton oblet CView en un objet de ta classe CMyView...

  3. #3
    Membre chevronn�
    Avatar de bigquick
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 356
    Par d�faut
    Salut,

    C'est le matin, j'ai peut-�tre les id�es embrouill�es mais tu n'utilise jamais de CView de base normalement. Tu en h�rites forc�ment...
    Donc je dirais que si tu n'as qu'un seul type de vue (celle qui h�rite de CView), alors tu peux simplement parcourir les vues (avec le code que tu as trouv�) et caster les pointeurs re�us en CTaView.

    Si par contre il y a plusieurs types de vues, je ne vois pas de moyen facile d'acc�der � un type de vue (ou � une vue) en particulier.

    Qu'est-ce que tu veux faire exactement ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 24
    Par d�faut
    En tout cas si il a plusieurs type de vues, le polymorphisme serait possible dans ce cas? Faire un vecteur de type de vues de base (TaView) qui fait des fonctions virtuelles et dans ce vecteur tu mets des TaView2 qui herite de TaView etc et chaqune des sp�cifications de TaView d�finit sa propre fonction, virtuelle chez TaView

  5. #5
    Membre confirm�
    Inscrit en
    Mars 2005
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par d�faut pr�cisions
    Je travaille sur une application SDI. Cela m'a permis d'avoir automatiquement 1 classe CWinApp, une classe CView, une classe CDocument et une classe CFrameWnd.

    J'ai un seul document template, par contre j'ai splitt� ma CMainFrame avec un Splitter Static et j'ai cr�� de nouvelles classes View. Du coup je me retrouve avec � la fois la classe View qui a �t� cr�� automatiquement et celles que j'ai rajout�es. (Je ne sais pas si ce que j'ai fait est tr�s propre d'ailleurs...)

    Extraits de mon code :

    Ca c'est ce qui a �t� cr�� automatiquement

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    CSingleDocTemplate* pDocTemplate;
    	pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CValidProd3Doc),
    	    RUNTIME_CLASS(CMainFrame),// main SDI frame window
    		RUNTIME_CLASS(CValidProd3View));
    	AddDocTemplate(pDocTemplate);
    J'ai rajout� une classe qui h�rite de CFormView que j'ai appel� :
    CInterractiveView (elle n'est pas rajout�e dans un Doc template ou truc du genre)

    J'aimerai pouvoir r�cup�rer dans mon application des pointeurs aussi bien sur me classe CValidProd3View et CInterractiveView.

    Voil� ce que j'ai fait : (le code a �t� copier puis adapter � partir de la faq)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		CWinApp* pApp = AfxGetApp();        
    		CDocTemplate* pTemplate;
    		POSITION pos = pApp->GetFirstDocTemplatePosition();
    		ASSERT(pTemplate);
    		POSITION pos2 = pTemplate->GetFirstDocPosition();
            CDocument* pDoc = pTemplate->GetNextDoc(pos2);
            ASSERT(pDoc);
            POSITION pos3 = pDoc->GetFirstViewPosition();
            CView* pView = pDoc->GetNextView(pos3);
    		CValidProd3View* pValidView = (CValidProd3View*)(pView);
    Le code compile bien et sans warnings (remarque je ne sais m�me pas si j'affiche tous les warnings ;-p ) Par contre quand j'arrive dans le bout de code ci dessus, �a plante m�chamment...


  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 24
    Par d�faut
    Quand tu dis rajouter, tu dis h�riter de celle que VC++ t'as faite?... Ou alors c'est toi qui a h�rit� des View sur ce quoi VC++ � h�rit� ta view principale?

    Car normalement, si chacune des vues � des fonctions de bases, c'est pas difficile... Il faut que tu fasse un vecteur de la classe de base de tes View... mais rend la abstraite (par fonctions virtuelles et une virtuelle pure si �a fonctionne pas) et sp�cialise alors chacun des fonction dans chaque classe (View) qui h�rite de la principale...

    Tu vois :s???....

  7. #7
    Membre chevronn�
    Avatar de bigquick
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 356
    Par d�faut
    Beh en fait, si tu as plusieurs types de vues, tu ne peux pas caster la CView en CValidProd3View, tout simplement parceque c'est peut �tre une CInterractiveView.

    La solution du polymorphisme est, je pense, pas mal. Ajoutes simplement une classe interm�diaire entre CView et CValidProd3View (ou CinteractiveView), qui d�finit tout ce qu'on peut faire sur tes vues (en g�n�ral), et apr�s tu n'as plus qu'� caster le CView en CViewIntermediaire.


    Juste une question au passage, pourquoi ne rajoutes-tu pas un document template pour le 2�me type de vue ? Ca te permettrait d'instancier ces vues facilement. Par contre, n'appelle pas AddDocTemplate(pDocTemplate2); pour le second template, �a ne sert � rien (et pense � le deleter dans OnDestroy ).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 24
    Par d�faut
    J'explique un peu le polymorphisme rapidement :

    Tu as une classe Mammif�re...

    Tu veux te faire un zoo imaginons... et tu d�clare donc un vecteur de mammif�res :

    vector<Mammifere> zoo;

    Mais, tu te dis que Mammif�re est trop g�n�ral et tu veux heriter

    class Lion : public Mammifere
    class Tigre : public Mammifere

    Mais l�, tu te dis... oui, mais comment je fais pour foutre dans un vecteur???

    Alors d�j�, dans Mammifere :
    - fonctions virtuelles : virtual taFct();
    - une virtuelle pure : virtual taFct()=0;

    Ensuite, red�finir tes fonctions virtuelles dans tes classes h�rit�es si tu as envie...

    Et ensuite :

    vector<Mammifere *> zoo;

    Ainsi :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      class Mammifere{
             virtual taFct()=0;
             ...
             virtual taFct2();
      }
     
      class Lion : public Mammifere{
            taFct();
            taFct2();
      }
    Et ensuite:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
       vector <Mammifere *> zoo;
       Lion * lion = new Lion(...);
       zoo.push_back(lion);
    etc... et voil�, un vecteur qui contient plein de sortes de classes h�rit�es de Mammifere...

    Qu'on me corrige au cas ou...

  9. #9
    Membre confirm�
    Inscrit en
    Mars 2005
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par d�faut r�ponse
    Oulala...
    Pour r�pondre � DarkWiven, je dirai que mes classes View h�ritent soit de CView, soit de CFormView, mais n'ont pas d'autres liens entre elles. En gros, celle qui a �t� cr��e automatiquement h�rite de CView et celles que j'ai rajout�es h�ritent de CView ou de CFormView.

    Ceci dit, �a m'a pas l'air idiot du tout le truc que tu proposes. (Je v�rifie si j'ai bien compris.) En gros ce que je peux faire c'est :
    -d�clarer ma classe ValidProd3View en abstraite et d�finir tout un tas de m�thodes sympa dedans.
    -faire h�riter mes autres View de celle-ci et surcharger les m�thodes virtuelles dedans.
    -du coup, je garde le m�me code pour r�cup�rer les pointeurs sur une ValidProd3View.
    -Enfin j'utilise la m�thode IsKindOf pour v�rifier que j'ai bien telle ou telle vue. (je ne suis pas s�r de ce dernier point.)

    Pour r�pondre � la question de bigquik :
    "Juste une question au passage, pourquoi ne rajoutes-tu pas un document template pour le 2�me type de vue ? Ca te permettrait d'instancier ces vues facilement. Par contre, n'appelle pas AddDocTemplate(pDocTemplate2); pour le second template, �a ne sert � rien (et pense � le deleter dans OnDestroy )."

    Ben, je sais pas trop...
    (J'apprends sur le tas en VC++ et bcp grace � ce site) Je n'ai pas tr�s tr�s bien compris les docTemplate. Quel est l'int�ret des doc template? En quoi cela me permettrait-il d'instencier les vues facilement???

    Merci pour vos r�ponses

    PS : C'est g�nial le coup de la balise code.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 24
    Par d�faut
    Le polymorphisme est certes tr�s tr�s utile, mais utiliser avec prudence. Mais entre guillemet, je r�p�te ce que tu as dis pour confirmer :

    Une classe de base abstraite (fct virtuelles et une pure)
    Des classes qui en h�rite et qui d�finisse ces fonction � leur mani�re
    Et en dernier, le mieux, faire un vecteur qui ramassera chaque instanciation de ces classes qui h�ritent (un vecteur de la classe de base en pointeur), sinon �a fonctionne aussi de faire direct des conversions, mais l� c'est cho cho quand m�me (�a d�pend le sens de la conversion).
    + ce que j'ai dis moi ^^

    Attention : les fct virtuelles et les pures doivent avoir une d�finition aussi...

    Au cas ou, que quelqu'un me dise si j'ai fait des fautes qque part, et aussi, je te conseille de te documenter aussi dessus, niveau syntaxe car p� j'ai oubli� qqchose.

  11. #11
    Membre chevronn�
    Avatar de bigquick
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 356
    Par d�faut
    En fait, je ne sais pas comment tu cr��s tes diff�rentes vues, mais un DocTemplate te permet de cr�er des documents et des vues en dehors des trucs standards Fichier->Nouveau ou Fichier->Ouvrir.

    Ca n'arrive peut �tre pas fr�quemment de cr��r un document sans passer par le menu, mais pour les vues �a peut etre pratique, par exemple pour ouvrir une nouvelle vue (ou pourquoi pas 2 vues de type diff�rents) sur un document existant.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	CFrameWnd* pFrame = m_pDocTemplate->CreateNewFrame(pDoc,NULL);
     
    	// erreur si la creation échoue
    	if(pFrame==NULL)
    	{
    		AfxMessageBox("Impossible de créér une nouvelle vue",MB_OK | MB_ICONERROR);
    		return;
    	}
     
    	// on init la frame : appelle OnInitialUpdate() de la vue
    	m_pDocTemplate->InitialUpdateFrame(pFrame,pDoc);
    Ici pDoc est le pointeur sur le document sur lequel tu veux voir � travers la vue. Ca peut �tre un document d�j� existant (que tu auras stock� quelquepart), ou un document que tu viens de cr��r avec
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    CMyDoc* pDoc = m_pDocTemplate->CreateNewDocument();
    ou encore NULL, si la vue n'a pas encore de document associ�...

    Regarde ce lien-l� pour avoir plus de d�tails
    http://msdn.microsoft.com/library/de...ocTemplate.asp

  12. #12
    Membre confirm�
    Inscrit en
    Mars 2005
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par d�faut arg...
    En fait, c'est pas si simple que �a...

    Certaines de mes classes h�ritant de CView et d'autres de CFormView...

    Du coup il faut que ma classe abstraite h�rite de CView et que mes autres classes h�ritent
    soit :
    juste de ma classe abstraite
    soit
    de ma classe abstraite et de CFormView � la fois. (De plus CFormView h�rite aussi de CView)

    Bref, �a fout un peu la merde dans mon code et je me demande s'il ne serait pas plus simple de faire comme suit :

    Je r�cup�re des pointeurs de type CView. Je v�rifie quelle est la classe avec la m�thode IsKindOf. Si �a renvoie la bonne classe je fais un cast. Comme �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    					if(pView->IsKindOf(RUNTIME_CLASS(CInterractiveView)))
                    {
                      CInterractiveView * pintView = (CInterractiveView*)(p);
    						pintView->Test();
     
                    }
    Je me demande juste si les cast comme �a ne risque pas de faire planter mon code au bout d'un moment... Ca marche bien les cast comme �a???

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2004
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 24
    Par d�faut
    MMMhhh, moui... j'm'y connais pas en vue, mais si tu veux en gerer plusieurs � caract�re diff�rents et voir laquelle est-ce, c'est bon comme �a je crois...

  14. #14
    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,
    j'arrive apres la bataille ,
    en SDI c'est assez simple :
    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
     
    // extrait de CMainFrame pour la creation du splitter
        //if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSdiSplitterView), CSize(100, 100), pContext) ||
        //    !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMyFormView), CSize(100, 100), pContext))
     
        // code a placer n'importe ou :
        CMainFrame *pFrame=static_cast<CMainFrame *>(AfxGetMainWnd());
     
        CSdiSplitterView *pFirstView=static_cast<CSdiSplitterView *>(pFrame->m_wndSplitter.GetPane(0,0));
        ASSERT(pFirstView->IsKindOf(RUNTIME_CLASS(CSdiSplitterView)));
     
        // verification de la classe de base pour l'exemple
        ASSERT(pFirstView->GetRuntimeClass()->IsDerivedFrom(RUNTIME_CLASS(CListView)));
     
     
        CMyFormView *pEndView=static_cast<CMyFormView *>(pFrame->m_wndSplitter.GetPane(0,1));
        ASSERT(pEndView->IsKindOf(RUNTIME_CLASS(CMyFormView)));
     
        // verification de la classe de base
        ASSERT(pEndView->GetRuntimeClass()->IsDerivedFrom(RUNTIME_CLASS(CFormView)));
    apres avoir acced� a la mainframe ,je recupere les views directement dans le splitter..
    Note le controle sur la classe de base qui est valide si la classe finale dispose des macro implement_xxx

  15. #15
    Membre confirm�
    Inscrit en
    Mars 2005
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par d�faut une rude bataille
    La bataille fut rude. De nombreux corps sans vie gisaient �a et l�.

    D'autres agonisaient...

    Et puis farscape est arriv� pour sauver ceux qui pouvaient encore l'�tre.

    Merci � tous, le probl�me est r�solu. :-)

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 12
    Dernier message: 09/09/2013, 23h03
  2. R�ponses: 1
    Dernier message: 30/08/2012, 21h28
  3. R�ponses: 3
    Dernier message: 03/03/2010, 11h48
  4. R�cup�rer un pointeur sur une classe Singleton
    Par slake13 dans le forum D�buter
    R�ponses: 7
    Dernier message: 18/11/2008, 17h01
  5. [MFC] Probl�me pointeur sur une classe
    Par mick74 dans le forum MFC
    R�ponses: 7
    Dernier message: 14/04/2004, 14h17

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