Je développe sous Visual C++.
J'ai crée deux classes vues au sein d'une fenetre splité en deux. Je souhaite effectuer un switch entre ces 2 classes vues en double cliquant via WindowProc.
Pour cela, j'ai crée la fonction suivante dans CMainFrame :
BOOL CMainFrame::ReplaceView(int row, int col, CRuntimeClass *pViewClass, SIZE size)
{
BOOL bSetActive=TRUE;
//if ((m_wndSplitter.GetPane(row,col)->IsKindOf(pViewClass))==TRUE)
// return FALSE;
// Get pointer to CDocument object so that it can be used in the creation
// process of the new view
CDocument * pDoc= ((CView *)((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.GetPane(row,col))->GetDocument();
CView * pActiveView = GetActiveView();
if (pActiveView==NULL || pActiveView==m_wndSplitter.GetPane(row,col))
bSetActive=TRUE;
else
bSetActive=FALSE;
// set flag so that document will not be deleted when view is destroyed
pDoc->m_bAutoDelete=FALSE;
// Delete existing view
((CView *)((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.GetPane(row,col))->DestroyWindow();
// set flag back to default
pDoc->m_bAutoDelete=TRUE;
// Create new view
CCreateContext context;
context.m_pNewViewClass=pViewClass;
context.m_pCurrentDoc=pDoc;
context.m_pNewDocTemplate=NULL;
context.m_pLastView=NULL;
context.m_pCurrentFrame=NULL;
CView * pNewView= (CView *)((CMainFrame*)AfxGetMainWnd())-> m_wndSplitter.CreateView(row,col,pViewClass,size, &context);
//CView * pNewView= (CView *)((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.GetPane(row,col);
RecalcLayout();
RedrawWindow();
return TRUE;
}
J'appelle cette fonction dans WindowProc qui se situe dans une de mes classes vues :
CMonocanalView * pView=(CMonocanalView *) ((CMainFrame *) AfxGetMainWnd())->ReplaceView(0,1,RUNTIME_CLASS(CMonocanalView),CSize(900,600));
Des que j'éxecute et que je double-clique pour switcher, un message d'erreur me renvoie dans :
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// OnWndMsg does most of the work, except for DefWindowProc call
LRESULT lResult = 0;
if (!OnWndMsg(message, wParam, lParam, &lResult))
lResult = DefWindowProc(message, wParam, lParam);
return lResult;
}
Si quelqu'un se sent d'attaque pour résoudre ce pb, je le remercie.
LTSI.