nbsp; int nId = m_pView2- >GetDlgCtrlID();
m_pView2- >SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pView1- >SetDlgCtrlID(nId);
m_pView1- >ShowWindow(SW_HIDE);
m_pView2- >ShowWindow(SW_SHOW);
SetActiveView(m_pView2);
RecalcLayout();
}
m_nWhichView=1;
}
---- 以下是菜单选择视图一的处理函数:
if(m_nWhichView==1)
{
//原理同上
int nId = m_pView1- >GetDlgCtrlID();
m_pView1- >SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pView2- >SetDlgCtrlID(nId);
m_pView2- >ShowWindow(SW_HIDE);
m_pView1- >ShowWindow(SW_SHOW);
SetActiveView(m_pView1);
RecalcLayout();
m_nWhichView = 0;
}
---- 然后为文档类CDemoDoc 添加成员数据 CString m_Hello,用于视图一的显示数据和视图二的编辑数据。
---- 最后分别加入视图一和视图二的处理函数。
---- 在视图一中加入OnDraw处理函数用于显示数据,如下:
void CDemoView::OnDraw(CDC* pDC)
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
RECT rect;
GetClientRect(&rect);
pDC->SetTextColor(RGB(0,128,128));
pDC->DrawText(pDoc- >m_Hello,pDoc- >
m_Hello.GetLength(),&rect,DT_WORDBREAK);
}
---- 在视图二中加入用于相应数据改变的处理函数:
void CMyEditView::OnChange()
{
// TODO: If this is a RICHEDIT control,
the control will not
// send this notification unless you override
the CEditView::OnInitDialog()
// function to send the EM_SETEVENTMASK
message to the control
// with the ENM_CHANGE flag
ORed into the lParam mask.
// TODO: Add your control
notification handler code here
//仅将数据保存到文档
CDemoDoc *pDoc = (CDemoDoc *)GetDocument();
GetWindowText(pDoc- >m_Hello);
}
---- 注意:编译前在MainFrm.cpp中加入DemoView.h 和MyEditView.h 和 DemoDoc.h三个头文件。于是大功告成,可以进行编译测试了。
---- 总结:使用MDI和CSplitter来实现多视,无非是隐含的使用AddView来实现一文档多视,而这里,笔者直接使用了AddView来实现多视。当然,朋友们可能会问,上面这个演示
程序,为什么只能在各个视图中切换,而不能同时将其显示在主窗口的客户区。其实,同时显示在客户区是可能的,笔者经过多次试验,发现两个视图完全可以显示在