使用CDocument类的AddView和RemoveView来切换
在CDocument类中,AddView和RemoveView可以说是专门用于单文档视图的切换的,具体实现过程如下:
(1) 在CMainFrame类添加两个变量,一个是CViewerView类指针对象m_pMainView,另一个是CWebView类指针对象m_pWebView。需要说明的是,用"添加成员变量向导"添加指针对象m_pMainView时,指定的类型名应是CViewerView*,注意后面的星号。m_pWebView添加时也类似。
(2) 为CWebView类添加一个CString类成员变量strFileName。
(3) 将CWebView::OnInitialUpdate中的语句"
"删除。
(4) 在CMainFrame类添加成员函数SwitchToView2,用于切换视图,其代码如图13所示。
图13 SwitchToView2函数代码
(5) 将CMainFrame::OnViewText和OnViewHtml中的SwitchToView1函数调用改为SwitchToView2,其余不变。
(6) 运行程序,结果如前图2所示。
两种切换方法的比较 SwitchToView1切换方法实质上是创建两个具有与文档相关联的视图,即视图创建时指定CCreateContext结构,具有很直接的"一档多视"的关系。而SwitchToView2方法是通过CDocument类的AddView和RemoveView来改变一个文档与多个视图的关联。
由于SwitchToView1中创建的视图带有文档关联,因此可以直接在视图类中通过GetDocument()函数来获取相关联的文档指针,从而可以访问文档中的数据。而SwitchToView2中创建的视图本身不带文档关联,因此无法直接访问文档中的数据。
由于SwitchToView2中需要在函数外指定视图类指针变量,因此在各个视图中可以通过AfxGeMainWnd()获取CMainFrame类指针,从而可以直接该问到CMainFrame类中定义的public视图类指针变量,这样便可在视图类之间直接访问。而SwitchToView1中的视图类指针变量是在函数内定义的,因此无法在各个视图类中进行视图之间的访问,并且在本例中CViewerView类对象被创建了两次。SwitchToView2中,CViewerView类对象只创建一次。
除了上述两种方法外,还有一种方法,那就是使用静态切分机制来进行。由于它涉及过多的底层方法,对初学者而言,相对较难,因此这里不再给出。
结束语 在本讲中,我们重点讨论了视图类的添加、单文档的视图切换方法和技巧。对于初学者来说,学习并掌握这些技巧能对MFC的文档/视图机制有一个较为深入的了解。当然,MFC文档/视图机制本身是非常复杂的,在以后的学习中应慢慢地体会和理解。在最后一讲中,我们将重点应用程序的安装和部署。
查看本文来源