CDocument/CView结构
①一点说明
在CDocument/CView结构中开发人员不必把精力放在各个部分的结构和联系上,而只需要集中精力在具体实现数据的保存、显示。文档类负责管理数据,提供保存和加载数据的功能。视类负责数据的显示,以及给用户提供对数据的编辑和修改功能。
当File/Open 或 File/Save 时,执行CDocument类的Serialize()函数,这个函数负责保存或打开文件。
当打开一个文件后,Application Framework会激活文件打开对话框让你指定文件名,然后调用CDocument::Serial读取文件名。Application Framework会调用CView::OnDraw传递一个显示DC,以便重绘打开的内容显示在View类上。
②CDocument::Serialize
void CDocument::Serialize(CArchive& ar)
{
if(ar.IsStoring) //如果是保存文件
{
//codes
//如果是串行化写对象,那么会转去执行该对象的Serialize函数
}
else //如果是打开文件
{
//codes
//如果是串行化读取对象,那么会转去执行该对象的Serialize函数
}
}
③CDocument / CView 互相获得对方指针
★在CDocument类中获得CView类指针1
vritual POSITION CDocument::
GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;
eg.
POSITION pos = GetFirstViewPosition();
//单文档
CMyView* pView = (CMyView*) ( GetNextView(pos) );
//多文档
while(pos != NULL)
{
CMyView* pView = (CMyView*) ( GetNextView(pos) );
//codes 省略,根据需要处理
}
★在CDocument类中获得CView类指针2
获得当前View指针
CMainFrame *pMainFram = (CMainFrame *) (AfxGetApp()->m_pMainWnd);
CMyView *pView = (CMyView*) (pMainFram->GetActiveView());
★从CView类获得CDocument类指针
这个比较简单,在CView类中提供了获得CDocumnt类指针的成员函数
CDocument* CView::GetDocument() const;
eg.
CMy61Doc* CMy61View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy61Doc)));
return (CMy61Doc*)m_pDocument;
}
void CMy61View::OnDraw(CDC* pDC)
{
CMy61Doc* pDoc = GetDocument();
}