求高人解决:SDI的视图切换有关问题
求高人解决:SDI的视图切换问题
设计一个应用程序,SDI,有三个视图(一个是程序启动进入的欢迎界面,另外两个是实际去要进行切换的界面)。
并且,两视图是从CFormView继承来的。
写了视图切换函数CFrameWnd::SwichToView()如下:(该函数应该没问题,在其他程序中用过)
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = (CView*) GetDlgItem(myView);
if(pNewActiveView == NULL)
{
switch(myView)
{
case IDD_DATCOLLECTION:
pNewActiveView = new DatCollectionDLG();
break;
case IDD_DATANALYSE:
pNewActiveView = new DatAnalyseDLG();
break;
default :
break;
}
CCreateContext context;//link doc and view
context.m_pCurrentDoc = pNewActiveView-> GetDocument();
pNewActiveView-> Create(NULL,NULL,WS_BORDER|WS_CHILD,CFrameWnd::rectDefault,this,myView,&context);//create wnd
pNewActiveView-> OnInitialUpdate();//init view
}
SetActiveView(pNewActiveView);
pNewActiveView-> ShowWindow(SW_SHOW);//show new view
pOldActiveView-> ShowWindow(SW_HIDE);//hide old view
//set old view id
if(pOldActiveView-> GetRuntimeClass() == RUNTIME_CLASS(DatAnalyseDLG))
SetDlgCtrlID(IDD_DATANALYSE);
else if(pOldActiveView-> GetRuntimeClass() == RUNTIME_CLASS(DatCollectionDLG))
SetDlgCtrlID(IDD_DATCOLLECTION);
// else if(pOldActiveView-> GetRuntimeClass() == RUNTIME_CLASS(VelTableDLG)
// SetDlgCtrlID(IDD_VELTABLE);
pNewActiveView-> SetDlgCtrlID(AFX_IDW_PANE_FIRST);//?
delete pOldActiveView;
RecalcLayout();
编译连接后,程序能进入初始的欢迎界面,但是一切换两视图中的任一个,出现严重错误。
Debug Assertion Failed!
不知怎么回事?指教。
------解决方案--------------------
我的是mdi,用的也是formview,可以切换的,看看代码
// MainFrm.h
class CMainFrame : public CMDIFrameWnd
{
DECLARE_DYNAMIC(CMainFrame)
public:
CMainFrame();
// Operations
public:
CChildFrame * m_ChildFrameView;//在MainFrm.h中定议一个CChildFrame 指针
}
// MainFrm.cpp
void CMainFrame::OnShowMyFormView()
{
// TODO: Add your command handler code here
if( m_ChildFrameView!=NULL)
{
m_ChildFrameView-> MDIActivate();
return;
}
CCreateContext context;
//context.m_pNewDocTemplate=(CMyApp *)AfxGetApp()-> GetFirstDocTemplatePosition();
context.m_pNewViewClass=RUNTIME_CLASS(CMyFormView);
m_ChildFrameView=new CChildFrame();
m_ChildFrameView-> SetTitle( "管理数据库 ");
if(! m_ChildFrameView-> LoadFrame(IDR_TYPE,WS_MAXIMIZE|WS_OVERLAPPEDWINDOW,this,&context))
return;
m_ChildFrameView-> ShowWindow(SW_SHOWMAXIMIZED);
m_ChildFrameView-> InitialUpdateFrame(NULL,true);
}
设计一个应用程序,SDI,有三个视图(一个是程序启动进入的欢迎界面,另外两个是实际去要进行切换的界面)。
并且,两视图是从CFormView继承来的。
写了视图切换函数CFrameWnd::SwichToView()如下:(该函数应该没问题,在其他程序中用过)
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = (CView*) GetDlgItem(myView);
if(pNewActiveView == NULL)
{
switch(myView)
{
case IDD_DATCOLLECTION:
pNewActiveView = new DatCollectionDLG();
break;
case IDD_DATANALYSE:
pNewActiveView = new DatAnalyseDLG();
break;
default :
break;
}
CCreateContext context;//link doc and view
context.m_pCurrentDoc = pNewActiveView-> GetDocument();
pNewActiveView-> Create(NULL,NULL,WS_BORDER|WS_CHILD,CFrameWnd::rectDefault,this,myView,&context);//create wnd
pNewActiveView-> OnInitialUpdate();//init view
}
SetActiveView(pNewActiveView);
pNewActiveView-> ShowWindow(SW_SHOW);//show new view
pOldActiveView-> ShowWindow(SW_HIDE);//hide old view
//set old view id
if(pOldActiveView-> GetRuntimeClass() == RUNTIME_CLASS(DatAnalyseDLG))
SetDlgCtrlID(IDD_DATANALYSE);
else if(pOldActiveView-> GetRuntimeClass() == RUNTIME_CLASS(DatCollectionDLG))
SetDlgCtrlID(IDD_DATCOLLECTION);
// else if(pOldActiveView-> GetRuntimeClass() == RUNTIME_CLASS(VelTableDLG)
// SetDlgCtrlID(IDD_VELTABLE);
pNewActiveView-> SetDlgCtrlID(AFX_IDW_PANE_FIRST);//?
delete pOldActiveView;
RecalcLayout();
编译连接后,程序能进入初始的欢迎界面,但是一切换两视图中的任一个,出现严重错误。
Debug Assertion Failed!
不知怎么回事?指教。
------解决方案--------------------
我的是mdi,用的也是formview,可以切换的,看看代码
// MainFrm.h
class CMainFrame : public CMDIFrameWnd
{
DECLARE_DYNAMIC(CMainFrame)
public:
CMainFrame();
// Operations
public:
CChildFrame * m_ChildFrameView;//在MainFrm.h中定议一个CChildFrame 指针
}
// MainFrm.cpp
void CMainFrame::OnShowMyFormView()
{
// TODO: Add your command handler code here
if( m_ChildFrameView!=NULL)
{
m_ChildFrameView-> MDIActivate();
return;
}
CCreateContext context;
//context.m_pNewDocTemplate=(CMyApp *)AfxGetApp()-> GetFirstDocTemplatePosition();
context.m_pNewViewClass=RUNTIME_CLASS(CMyFormView);
m_ChildFrameView=new CChildFrame();
m_ChildFrameView-> SetTitle( "管理数据库 ");
if(! m_ChildFrameView-> LoadFrame(IDR_TYPE,WS_MAXIMIZE|WS_OVERLAPPEDWINDOW,this,&context))
return;
m_ChildFrameView-> ShowWindow(SW_SHOWMAXIMIZED);
m_ChildFrameView-> InitialUpdateFrame(NULL,true);
}