孙鑫 第十三课之三 文档与串行化(CDocument/CView结构)

本文介绍了CDocument/CView结构的基本原理,详细解释了CDocument类如何管理数据及保存加载功能,CView类如何实现数据展示及编辑。此外还探讨了文件打开与保存时的Serialize函数工作流程,以及CDocument与CView之间相互获取对方指针的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();

}


孙鑫 第十三课之三  文档与串行化(CDocument/CView结构) - 大灰狼 - 大灰狼 的博客


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值