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 :

VC++ 6.0 MDI archi doc/vue gérer 2 vues avec splitter


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut VC++ 6.0 MDI archi doc/vue gérer 2 vues avec splitter
    Salut,
    J'ai deux Splitter
    CSplitter1 : avec FormulaireA(CFormView)/C*View
    CSplitter2 : avec FormulaireB(CFormView)/C*View
    Dans FormulaireA j'ai un bouton "vers B"
    Dans FormulaireB j'ai un bouton "vers A"
    Mon changement de vues marche très bien sans les splitters
    Je ne sais pas quel code ajouter et où :
    dans
    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
    void CMainFrame::SelectViewAB(UINT ViewID){
     
    	CView* pOldActiveView = GetActiveView();
    	CView* pNewActiveView;
     
    	switch(ViewID){
     
    		case 1 : 
    			pNewActiveView = (CView*) new CFormulaireB();
    			break;
    		case 2 : 
    			pNewActiveView = (CView*) new CFormulaireA();
    			break;
    		default :
    			AfxMessageBox("Identificateur de vue invalide");
    			return;
     
    	}
    	pNewActiveView->Create(NULL,NULL,0L, CFrameWnd::rectDefault,this,ViewID,NULL);
    	SetActiveView(pNewActiveView);
    	pOldActiveView->ShowWindow(SW_HIDE);
    	pNewActiveView->ShowWindow(SW_SHOW);
    	pOldActiveView->SetDlgCtrlID(m_CurrentViewID);
    	pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    	m_CurrentViewID = ViewID;
    	RecalcLayout();
    }

    ou dans le code du bouton "change vue vers B"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CFormulaireA::OnButtonChgb() 
    {
    	// TODO: Add your control notification handler code here
    	((CMainFrame*)GetParentFrame())->SelectViewAB(1);
     
    }
    ou dans

    C*App (RUNTIME_CLASS)

    quelqu'un peut m'aider ?

  2. #2
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    ton code m'a l'air bien compliqué ... mais j'ai pas trop saisi ce que tu cherches à faire.

    ta vue n'est pas créée correctement, je te conseille de passer par la fonction CreateView() de ton CMainFrame

    en paramètre, il y a la structure CCreateContext

    il faut renseigner au minimum le membre m_pNewViewClass (en faisant m_pNewViewClass=RUNTIME_CLASS(CFormulaireB) par exemple)
    et ça serait bien de faire le lien avec le document, donc renseigner aussi m_pCurrentDoc, mais c'est falcutatif ... mais tu perds tout les bénéfices d'une classe CView ... donc autant travailler avec des simples CWnd ...

    ensuite, lorsque la vue est créée, il faut l'initialiser correctement
    c'est fait automatiquement par la CMainFrame, lors de la création de la première vue, mais pas quand tu les créées toi meme ...
    il manque l'envoi du message WM_INITIALUPDATE, pour que la méthode OnInitialUpdate() de ta vue soit appelé
    bien que toi tu ne l'utilises peut etre pas, mais la classe CFormView en a besoin ... et en plus, avec les CFormView, il y a une histoire de Focus à l'initialisation ...

    donc le plus simple, serait d'appeler, après création de la vue, la méthode InitialUpdateFrame(), qui fait tout le travail que j'ai dis plus haut ...

    et pour finir, tu ne détruis pas l'ancienne vue ? le ShowWindow(SW_HIDE) ne fait que masquer la vue, mais ne détruis pas la fenetre, ni la classe associée ...

    /!\ ne pas faire de delete sur une vue !!!
    juste faire un DestroyWindow(), les vues s'auto-détruisent automatiquement (le delete est fait automatiquement)

    explique un peu mieux ce que tu souhaites vraiment faire, car je ne vois pas le lien avec le splitter ...

    @+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    merci Stephdim,

    Je suis en train d'étudier ta réponse.
    Mais le code que j'ai donné concerne l'échange de vues entre les deux formulaires A et B sans les splitters et il marche mais je vais prendre note de tes remarques car je débute dans l'archi doc/vue je débroussaille.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    J'ai fait un progrès : je sais passer de la vue FormulaireA/CView à la vue FormaireA/FormulaireC et inversement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void CFormulaireA::OnButtonChgc() 
    {
    	// TODO: Add your control notification handler code here
    	CSplitterWnd* Split = (CSplitterWnd *) GetParent();
    	Split->DeleteView(0,1);
    	Split->CreateView(0,1,RUNTIME_CLASS(CFormulaireC),CSize(300,300),NULL);
    	Split->RecalcLayout();
    }
    je sais passer de la vue FormulaireA/CView à la vue FormaireB et mais pas inversement quelqu'un a une id sans passer par CCreateContext mais en utilisant ce que j'ai utilisé précédemment ?

    Je continue à étudier ta réponse StephDim je vais essayer d'utiliser le CCreateContext....

Discussions similaires

  1. [Doctrine] Gérer une vue dans le schema.yml
    Par dialloumar dans le forum ORM
    Réponses: 3
    Dernier message: 08/03/2012, 14h47
  2. soucis pour gérer plusieurs vues
    Par Goffer dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 15/10/2010, 02h24
  3. [Toutes versions] Gérer clic Vue Normal , bandeau de diapositive
    Par czy-robicz dans le forum VBA PowerPoint
    Réponses: 5
    Dernier message: 29/04/2009, 17h09
  4. VC++ 6.0 MDI archi doc/vue avec splitter wizard
    Par nina_geej dans le forum MFC
    Réponses: 2
    Dernier message: 24/03/2009, 14h45
  5. Gérer un moteur avec un 6809
    Par copro dans le forum Autres architectures
    Réponses: 5
    Dernier message: 05/04/2004, 14h23

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