2016-09-21 2 views
0

J'ai des questions sur l'application MFC. De nos jours, je suis en train de maintenir un projet MFC existant. Et il y a un énorme problème. Nous n'utilisons pas de classe de document pour la classe de vue. Par exemple, il y a un cadre enfant qui fait 3 vues. Trois d'entre eux utilisent presque les mêmes données. Mais chaque vue obtient les données par elle-même et non par le document. donc il y a beaucoup de code dupliqué.Plusieurs vues pour un document dans Childframe avec application MDI

Je veux résoudre ce problème et refactoriser. J'ai donc cherché comment lier les vues et doc dans un cadre enfant. Et tous les exemples concernaient le constructeur CMultiDocTemplate. est ce que j'ai essayé.

CMultiDocTemplate* pDocTemplate; 
pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE, 
    RUNTIME_CLASS(CMFCApplication3Doc), 
    RUNTIME_CLASS(CChildFrame), 
    RUNTIME_CLASS(CMFCApplication3View)); 
if (!pDocTemplate) 
    return FALSE; 
AddDocTemplate(pDocTemplate); 

pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE, 
    RUNTIME_CLASS(CMFCApplication3Doc), 
    RUNTIME_CLASS(CChildFrame), 
    RUNTIME_CLASS(MyTreeView)); 
if (!pDocTemplate) 
    return FALSE; 
AddDocTemplate(pDocTemplate); 

Si je comme ci-dessus, il a demandé l'image que vous souhaitez afficher. Ce n'était pas ce que je voulais. C'était un cadre différent.

Je souhaite créer plusieurs vues et un document dans un même cadre enfant. Et j'ai aussi essayé de cette façon.

CMultiDocTemplate* pDocTemplate; 
pDocTemplate = new CMultiDocTemplate(IDR_MFCApplication3TYPE, 
    RUNTIME_CLASS(CMFCApplication3Doc), 
    RUNTIME_CLASS(CChildFrame), 
    NULL); 
if (!pDocTemplate) 
    return FALSE; 
AddDocTemplate(pDocTemplate); 

NULL pour une vue. Et créer des vues dans OnCreateClient d'un cadre enfant()

BOOL CChildFrm::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*  pContext) 
{ 
    m_wndSplitter1.CreateStatic(this, 2, 1); 
    m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2); 
    m_wndSplitter3.CreateStatic(&m_wndSplitter2, 2, 1); 
    m_wndSplitter3.CreateView(1,0 , RUNTIME_CLASS(CTestView), CSize(200, 300), pContext); 
    m_wndSplitter3.CreateView(0,0 , RUNTIME_CLASS(CTestView2), CSize(200, 200), pContext); 
} 

Il peut bien créer plusieurs vues. Mais je ne sais pas comment lier CTestView, CTestView2 et un document. Lorsque j'approche une classe de document dans une vue TestView, je ne peux approcher que CDocument qui est la classe de document de base. Je veux aborder un document spécifique comme CTestDocument.

Y at-il un moyen? Si là, s'il vous plaît faites le moi savoir.

Merci d'avoir lu mes questions.

Répondre

1

Lors de la création d'une vue, le document auquel elle appartient est transmis dans CCreateContext.

Le modèle de document a la fonction simple CMultiDocTemplate :: CreateNewFrame. Avec cette fonction, vous créez une nouvelle combinaison image/vue avec un modèle existant.

Il y a également la fonction CFrameWnd :: CreateView prend un CCreateContext ...

0

Il est une pratique courante dans MFC pour ajouter un membre GetDocument() à vue.

//.h 
#ifndef _DEBUG 
    CTestDocument* GetDocument() { return dynamic_cast< CTestDocument* >(CView::GetDocument()); } 
#else 
    CTestDocument* GetDocument(); 
#endif 

//.cpp 
#ifdef _DEBUG 
CTestDocument* RaRichView::GetDocument() 
{ 
    assert(dynamic_cast< CTestDocument* >(CView::GetDocument())); 
    return dynamic_cast< CTestDocument* >(CView::GetDocument()); } 
#endif 

Vous voulez changer CMFCApplication3Doc avec CTestDocument il est donc le document ouvert pour votre cadre.