MFC单文档多视图的切换的3种实现

MFC单文档多视图的切换的3种实现

MFC建立程序工程向导时最后一步,选择CFormView作为View的基类。

假设工程名称为CMySingleDoc。

默认生成的View类名为:CMySingleDocView,它的属性为WS_CHILD,切记必须为WS_CHILG子窗口风格,不能为WS_POPUP弹出式窗口风格。

 

进入工程资源视图,添加对话框资源,添加控件,完成后再为对话框添加类,注意选择CFormView作为基类,这样将生成视图类(派生自CFormView)。假设名称为CMyView1.

第一种实现:

利用CFrameWndCreateView成员函数通过CCreateContext结构与文档产生关联

MSDN微软官方对这个函数的说明:

这个函数是用来在在一个框架窗口内创建视图的。该函数有2个参数,一个是CCreateContext结构用来设置与视图关联的文档类,第二个参数默认是AFX_IDW_PANE_FIRST注意一般不要修改,默认即可,下面将讲解为什么保持默认,这个参数到底有什么含义。

 

 

参考代码如下:

CDocument *pDoc= GetActiveDocument();
GetActiveView()->DestroyWindow();
CCreateContext cc;
cc.m_pNewViewClass= RUNTIME_CLASS(CMyView1);
cc.m_pCurrentDoc=pDoc;
cc.m_pCurrentFrame=this;
CView *pNewView =(CView *)this->CreateView(&cc);
this->SetActiveView(pNewView);  //必须手动设置视图Active状态
this->ShowWindow(SW_SHOW); //手动设置可见
RecalcLayout();


 

第二种实现:

CCreateContext结构使CMyView1视图与Document对象关联

 1.  把向导生成的CMyView1的默认构造函数的Protected属性改为Public;后面我们会用到构造函数构造对象,第一种方法使用的是动态创建的方法,所以不需要更改Protected属性。

2.  必须重写CWnd::Create()方法(上图MSDN有说明)

CView *pOldView = GetActiveView();
CView *pNewView = (CView *)new CMyView1();
CCreateContext cc;
cc.m_pCurrentDoc =GetActiveDocument();
cc.m_pNewViewClass =RUNTIME_CLASS(CShowDlg1);
//必须重写CWnd::Create()方法
pNewView->Create(NULL,NULL,WS_CHILD | WS_BORDER,CMainFrame::rectDefault,this,AFX_IDW_PANE_FIRST,&cc);
this->SetActiveView(pNewView);
pNewView->ShowWindow(SW_SHOW);
pOldView->ShowWindow(SW_HIDE);
delete pOldView;
RecalcLayout();


 

3.  /*第三种方法,用Document.AddView()使CMyView1视图与文档关联*/

CDocument *pDoc = GetActiveDocument();
CView *pOldView = GetActiveView();
CView *pNewView = (CView *)new CShowDlg1();
pNewView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,CMainFrame::rectDefault,this,
		AFX_DW_PANE_FIRST+1,NULL);
//交换View的ID号,至于为什么交换?看上图MSDN解释
int nID = pNewView->GetDlgCtrlID();
pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pOldView->SetDlgCtrlID(nID);
SetActiveView(pNewView); //手动设置Active活动状态
pNewView->ShowWindow(SW_SHOWMAXIMIZED);//手动设置可见
pOldView->ShowWindow(SW_HIDE);
pDoc->AddView(pNewView);  //是CMyView1与文档类产生关联
pDoc->RemoveView(pOldView);
RecalcLayout();

你可能感兴趣的:(VC/MFC)