浙江鄞县钟公庙镇长丰二村 王磊
---- 《
计算机世界》前几期介绍了两种实现多视的方法。前者,作者利用MDI方法来实现,编程比较复杂;而后者作者使用CSpillterWnd类来实现多视。
---- 事实上,MFC在CDocument类中已经为我们封装了实现多视的直接方法,如果查阅一下联机文档,可以发现,CDocument中有AddView 和RemoveView两个成员函数,恰恰是这两个函数,为我们实现多视提供了便捷。
---- 下面是关于CDocument::AddView和CDocument::RemoveView的简单介绍,具体请参见联机文档:
void CDocument::AddView( CView* pView );
---- 为当前CDocument类实例加入新的视图。其中参数pView是指向新视图的指针。
Void CDocument::RemoveView ( CView* pView );
---- 从当前的CDocument类实例中移去一个视图。其中参数pView是指向要移去的视图的指针,注意必须在该视图不可见的情况下才能移去,否则会产生异常。
---- 通过这两个函数,我们可以方便的实现增加和移去视图。
---- 下面是实现的一个实例:
---- 本实例实现一文档两视图的功能。视图一由CView派生,用来显示文档中的数据,而视图二由CEditView派生,用来对文档中的数据进行编辑。用“查看”菜单中的视图一、视图二来选择视图。关于如何实现加入新的视图类和菜单请参考其他
资料。
---- 下面为主窗口类添加数据成员和消息处理函数:
CDemoView *m_pView1;
//指向视图一的指针,CDemoView由应用向导生成
CMyEditView *m_pView2;
//指向视图二的指针,CMyEditView派生于CEditView
int m_nWhichView;
//指示当前为哪一个视图,并初始化为0
---- 以下是菜单选择视图二的处理函数:
void CMainFrame::OnView2()
{
// TODO: Add your command handler code here
if(m_pView2==NULL)
{
//取得视图一的指针
m_pView1 = (CDemoView *)GetActiveView();
//生成视图二实例对象
m_pView2 = new CMyEditView;
//取得活动文档的指针
CDemoDoc *pDoc = (CDemoDoc*)GetActiveDocument();
//为视图二实例对象创建窗口,
具体参数请参见联机文档的CWin::Create
m_pView2->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,
rectDefault,this,AFX_IDW_PANE_FIRST+1,NULL);
//下面置换视图一和视图二的ID号
//使得主窗口可以正确的使当前视图占据整个客户区
int nId = m_pView2- >GetDlgCtrlID();
m_pView2- >SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pView1- >SetDlgCtrlID(nId);
//显示视图二,隐藏视图一
m_pView2- >ShowWindow(SW_SHOW);
m_pView1- >ShowWindow(SW_HIDE);
//添加新视图
pDoc- >AddView(m_pView2);
//设置视图二位活动视图
SetActiveView(m_pView2);
m_pView2- >SetWindowText(pDoc- >m_Hello);
RecalcLayout();
}
else
if(m_nWhichView==0)
{ //同上,仅仅省略视图二的创建工作
&