Bonjour,
J'ai une application MFC : lorsque je fais fichier -> ouvrir, cela ouvre une formview et une view séparées par un splitter.
Jusque là tout va bien, mais quand je ferme juste cette fenêtre (pas la mainframe principale) et que je refais fichier -> ouvrir, j'ai une belle erreurJe ne vois pas d'où peut venir le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 " monprog.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru."
Dans la fonction OnOpen() de monprogdoc.cpp appelée par fichier->ouvrir
j'ouvre la fenêtre splittée comme ceci :
voici la fonction EkCreateNewWindow :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 EkCreateNewWindow( ((CmonprogApp*) AfxGetApp())->m_ptFormView, this );
dans monprog.cpp :
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 CFrameWnd* EkCreateNewWindow( CDocTemplate* pTemplate, CDocument* pDocument ) { ASSERT_VALID( pTemplate ); ASSERT_VALID( pDocument ); // 1 - Create the new frame window // (will in turn create the associated view) CFrameWnd* pFrame = pTemplate->CreateNewFrame( pDocument, NULL ); if( pFrame == NULL ) { // Window creation failed TRACE0( "Warning: failed to create new frame.\n" ); return NULL; } ASSERT_KINDOF( CFrameWnd, pFrame ); // 2 - Tell the frame to update itself // (and its child windows) pTemplate->InitialUpdateFrame( pFrame, pDocument ); // 3 - Return a pointer to the new frame window object return pFrame; }
et dans splitter.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 m_ptFormView = new CMultiDocTemplate( IDR_MESSAGE,//MAINFRAME, RUNTIME_CLASS(CmonprogDoc), // RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CSplitter), RUNTIME_CLASS(CMessage));
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 if (!m_wndSplitter.CreateStatic(this, 1, 2)) // Création dun splitter 1 ligne, 2 colonnes { TRACE0("Failed to CreateStaticSplitter\n"); return FALSE; } if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMessage), CSize(550, 0), pContext)) // CSize(300,0) : Positionnement du séparateur // CreateView (0, 0 : Ajout du premier panneau du splitter // (la vue par defaut est en colonne 0) { TRACE0("Failed to create first pane\n"); return FALSE; } if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CmonprogView), CSize(0, 0), pContext)) // CreateView (0, 1 : Ajout du deuxième panneau du splitter colonne 1 { TRACE0("Failed to create second pane\n"); return FALSE; } SetActiveView((CView*)m_wndSplitter.GetPane(0,1)); // rendre la vue active return TRUE;
Partager