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 erreur
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."
Je ne vois pas d'où peut venir le problème.
Dans la fonction OnOpen() de monprogdoc.cpp appelée par fichier->ouvrir
j'ouvre la fenêtre splittée comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
EkCreateNewWindow( ((CmonprogApp*) AfxGetApp())->m_ptFormView, this );
voici la fonction EkCreateNewWindow :

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;
}
dans monprog.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));
et dans splitter.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
24
25
26
 
 if (!m_wndSplitter.CreateStatic(this, 1, 2))
  // Création d’un 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;