单文档视图切换后,视图类不能正常使用

shanyuan3 2006-04-20 11:13:33
我在SDI下进行视图切换,代码如下:
CView *pOldActiveView=GetActiveView(); //保存旧视图
CView *pNewActiveView=(CView*)GetDlgItem(nView); //取得新视图
if(pNewActiveView==NULL)
{
switch(nView)
{
case IDD_VIRTUALORGANIZATION_FORM :
pNewActiveView=(CView*)new CVirtualOrganizationView;
break;
case IDD_PROCESSTEAMSVIEW :
pNewActiveView=(CView*)new CProcessTeamsView;
break;
case IDD_ADJUSTPROCESSSTATEVIEW :
pNewActiveView=(CView*)new CAdjustProcessStateView;
break;
}
CCreateContext context; //将文挡和视图相连
context.m_pCurrentDoc=this->GetActiveDocument();
pNewActiveView->Create(NULL, NULL,(AFX_WS_DEFAULT_VIEW ),
CFrameWnd::rectDefault, this, nView, &context);

pNewActiveView->OnInitialUpdate();
pNewActiveView->Invalidate();
}
SetActiveView(pNewActiveView); //改变活动的视图
pNewActiveView->ShowWindow(SW_SHOW); //显示新的视图
pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图

if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CVirtualOrganizationView))
pOldActiveView->SetDlgCtrlID(IDD_VIRTUALORGANIZATION_FORM);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CProcessTeamsView))
pOldActiveView->SetDlgCtrlID(IDD_PROCESSTEAMSVIEW);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CAdjustProcessStateView))
pOldActiveView->SetDlgCtrlID(IDD_ADJUSTPROCESSSTATEVIEW);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);

delete pOldActiveView; //删除旧视图

RecalcLayout(); //调整框架窗口
以上几个视图类都是FormView
切换后显示都正常,但是在视图类里设置的控件不好用了,使用CListCtrl对象插入内容时,会显示内存读取错误。请各位帮忙解决
...全文
169 9 点赞 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
shanyuan3 2006-04-23
谢谢各位指点
  • 打赏
  • 举报
回复
jieping 2006-04-21
我也遇到过类似的情况,我用DeleteView切换切分窗格的视图时,不删之前,控件是可以操作的,但删了之后再用CreateView重建就不可操作了,还会发生断言错,好像是指CWnd对象不存在。你这种方式切换的话,不删会留在内存里的,有隐患。
  • 打赏
  • 举报
回复
jieping 2006-04-21
Mackz(在相互) 说的对,在建完之後要手动OnInitialUpdate一下,现在我的窗格显示正常了。
  • 打赏
  • 举报
回复
dasiu 2006-04-21
给你个我的程序你参考以下
//***************************************************************
//函数功能: 初始化所有视图
// 1)
// 2)
// 3)
//
//说明:3个视图,不包括 common视图
//***************************************************************
BOOL CSDYNetCommApp::InitAllViews()
{

// TODO: Add your command handler code here
CMainFrame* pFrmWnd=(CMainFrame*)theApp.GetMainWnd();
CView *pNewView=NULL;

CCreateContext context;
context.m_pCurrentDoc=pFrmWnd->GetActiveDocument();
context.m_pCurrentFrame=NULL;
context.m_pLastView=NULL;
context.m_pNewDocTemplate=NULL;
context.m_pNewViewClass=NULL;

for(int i=0;i<4;i++)
{
UINT nID;
switch(i)
{
case 0:
nID=IDD_VIEW_MAIN;
if(!m_pViewMain)
{
pNewView=new CSDYNetCommView;
pNewView->Create(NULL,NULL,WS_CHILD,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewMain=(CSDYNetCommView*)pNewView;
}
break;
case 1:
nID=IDD_VIEW_HIST_ALARM;
if(!m_pViewHistAlarm)
{
pNewView=new CViewHistAlarm;
pNewView->Create(NULL,NULL,WS_CHILD,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewHistAlarm=(CViewHistAlarm*)pNewView;
}
break;
case 2:
nID=IDD_VIEW_HIST_SUPPLY;
if(!m_pViewHistSupply)
{
pNewView=new CViewHistSupply;
pNewView->Create(NULL,NULL,WS_CHILD,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewHistSupply=(CViewHistSupply*)pNewView;
}
break;
case 3:
nID=IDD_VIEW_QUANTITY;
if(!m_pViewQuantity)
{
pNewView=new CViewQuantity;
pNewView->Create(NULL,NULL,WS_CHILD,
CFrameWnd::rectDefault,pFrmWnd,nID,&context);
pNewView->SendMessage(WM_INITIALUPDATE,0,0);
m_pViewQuantity=(CViewQuantity*)pNewView;
}
break;
}
}

return TRUE;
}
  • 打赏
  • 举报
回复
laogong165 2006-04-20
CListCtr是怎么用的?
插入的内容哪里来的?
你的内存读取错误不一定就是切换视图惹的祸!
  • 打赏
  • 举报
回复
shanyuan3 2006-04-20
我从网上找的代码,建立新视图,旧的就不要了,不过这条语句去掉好像也没有什么问题
  • 打赏
  • 举报
回复
largedong 2006-04-20
delete pOldActiveView; //
删除旧视图干什么?
  • 打赏
  • 举报
回复
菜牛 2006-04-20
手动创建视图,OnInitialUpdate是不会调用的。
  • 打赏
  • 举报
回复
shanyuan3 2006-04-20
上面切换视图的代码在CMainFrame里,CListCtrl是FormView下的控件
我在文档模板里直接将原来的视图替换掉了,这时的视图类没有问题,如下面所示:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CVirtualOrganizationDoc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CMyView));//这是我新建的视图类,CListCtrl就在它的头文件声明
但是切换视图之后就不好用了。所以我认为是切换视图惹的祸
  • 打赏
  • 举报
回复
相关推荐
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2006-04-20 11:13
社区公告
暂无公告