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

来源:互联网 发布:php pop3发送邮件 编辑:程序博客网 时间:2024/05/28 04:52

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();
0 0
原创粉丝点击