VC如何SDI中进行多视图切换(销毁原视图)

在一些情况下,应用程序有许多信息要显示,当一个窗口内显示不下时,VC提供的MDI应用程序可以解决这个问题,但是如果应用程序只是对单个文档,采用多种方式显示,则采用SDI更合适。那么,如何在单文档应用程序中实现多视图呢?缺省情况下,派生类的构造函数是pretected类型的,必须将它改为public类型,因为我们将会动态生成派生视图类并切换活动的视图。也可以一次生成所有的视图,但是这样造成系统资源的极大浪费。

1   首先利用资源编辑器新建4个对话框,在对话框中添加需要的控件,各个对话框的ID分别为IDD_MULTIVIEW_FORM,IDD_MULTIVIEW_FORM2,IDD_MULTIVIEW_FORM3,IDD_MULTIVIEW_FORM4

2   为每一个对话框创建一个CFormView类的派生类,分别为:CView1,CView2,CView3,CView4

3   在应用程序的初始化文件中用CView1替换原先的视图,这样程序启动后的缺省显示视图是CView1,修改后的部分代码如下:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMultiViewDoc),
RUNTIME_CLASS(CMainFrame),        // main SDI frame window
RUNTIME_CLASS(CView1));
AddDocTemplate(pDocTemplate);

注:大家也可以用不使用VCiew1替代,保持原代码不动即可

4   利用资源编辑器,添加几个菜单,并添加相应的消息处理函数:
void CMainFrame::OnViewView1()
{
SwitchToForm(IDD_MULTIVIEW_FORM);   
}

void CMainFrame::OnViewView2()
{
SwitchToForm(IDD_MULTIVIEW_FORM2);   
}

void CMainFrame::OnViewView3()
{
SwitchToForm(IDD_MULTIVIEW_FORM3);   
}

void CMainFrame::OnViewView4()
{
SwitchToForm(IDD_MULTIVIEW_FORM4);   
}

在SDI中CFrame的派生类即CMainFrame控制着所有的视图,而且它允许用户通过消息处理进行视图的切换。进行视图切换的原理很简单,只是断开和旧视图的连接并把他删除,创建一个新视图,将文档和它相连,设置几个标志,然后显示新视图,SwitchToForm函数是进行视图切换的代码函数。

void CMainFrame::SwitchToForm(int nForm)
{
   //CDocument* pDoc = GetActiveDocument();
     CView *pOldActiveView=GetActiveView();              //保存旧视图
     CView *pNewActiveView=(CView*)GetDlgItem(nForm);    //取得新视图
     if(pNewActiveView==NULL)
     {
         switch(nForm)
             //这些ID是对话框的标志符,但也可以用其他的标志
         {
         case IDD_MULTIVIEW_FORM :
             pNewActiveView=(CView*)new CView1;
             break;
         case IDD_MULTIVIEW_FORM2 :
             pNewActiveView=(CView*)new CView2;
             break;
         case IDD_MULTIVIEW_FORM3 :
             pNewActiveView=(CView*)new CView3;
             break;
         case IDD_MULTIVIEW_FORM4 :
             pNewActiveView=(CView*)new CView4;
             break;
         }
         CCreateContext context;    //将文挡和视图相连
         context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD ,
             CFrameWnd::rectDefault, this, nForm, &context);


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

     if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView1))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView2))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM2);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView3))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM3);

else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CView4))
pOldActiveView->SetDlgCtrlID(IDD_MULTIVIEW_FORM4);

     pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    
    

delete pOldActiveView;    //删除旧视图

RecalcLayout();           //调整框架窗口
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值