博旭范文网 - 每天发现一点点
每天发现一点点!
  • 寓言
  • 谜语
  • 歇后语
  • 谚语
  • 顺口溜
  • 绕口令
  • 三句半
  • 三字经
  • 百家姓
  • 十二生肖
  • 励志
  • 诗词鉴赏
  • 当前位置:博旭范文网 > 实用文档 > 励志 >

    mfc单文档序列化

    分类:励志 时间:2017-07-27 本文已影响

    篇一:序列化的方法保存文件

    序列化的方法保存文件

    今天搞了一整天,看了网上很多的例子,但很多都不切实际,还是孙鑫的教学视频不错,虽然讲得太细令人发困,很多底层的东西还听不懂,但是凭借着一个同级牛人的代码勉强把这个给做出来了。

    持久性和序列化

    持久性是对象所有的保存和加载其状态数据的能力。具有这种能力的对象能够在应用程序结束之前以某种方式将当前的对象状态数据记录下来,当程序再次运行时,通过对这些数据的读取而恢复到上一次任务结束时的状态。由于绝大多数的MFC类是直接或间接由MFC的CObject类派生出来的,因此这些MFC类都具有保存和加载对象状态的能力,是具有持久性的。在使用应用程序向导生成文档/视结构的程序框架时,就已经为应用程序提供了用于对象状态数据保存和加载的基本代码。

    为实现对象的持久性,通常多以字节流的形式将记录对象状态的数据存放到磁盘上,这种将状态数据保存到磁盘和从磁盘恢复到内存的过程称为序列化。序列化是MFC的一个重要概念,是MFC文档/视图结构应用程序能进行文档打开、保存等操作的基础。当在MFC框架程序中装载或保存一个文件时,除了打开文件以供程序读写外,还传递给应用程序一个相关的CArchive对象,并以此实现对持久性数据的序列化。

    为了使一个类的对象成为持久的,可以自定义一个持久类,将持久性数据的存储和加载的工作交由自定义类自己去完成。这种处理方式也更加符合面向对象的程序设计要求。可以通过下面几个基本步骤来创建一个能序列化其成员变量的自定义持久类:

    1. 直接或间接从CObject类派生出一个新类。

    2. 在类的声明部分包含MFC的DECLARE_SERIAL宏,该宏只需要将类名作为参数。

    3. 重载基类的Serialize()函数,并添加对数据成员进行序列化的代码。

    4. 如果构造函数没有一个空的缺省的构造函数(不含任何参数),为其添加一个。

    5. 在类的实现部分,添加MFC的IMPLEMENT_SERIAL宏。该宏需要三个参数:类名,基类名和一个方案号。其中方案号是一个相当于版本号的整数,每当改变了类的序列化数据格式后就应当及时更改此数值。

    上面是建立这个类的五部关键点。那现在开始做这个实例:名片夹--ncard。 1---建立一个单文档程序;

    2---新建一个类CPerson.直接在doc的头文件里建立即可。

    class CPerson :public CObject///第一点:从CObject派生

    {

    public:

    CString name,cellphone,address,qqnum; //名片的信息内容.

    public:

    DECLARE_SERIAL(CPerson); //第二点:包含MFC的DECLARE_SERIAL宏,参数为类名。

    void Serialize(CArchive&ar); //第三点:重载基类的Serialize()函数,并添加对数据成员进行序列化的代码。

    Person(){};//第四点:添加一个没有参数的构造函数。

    void Display(int y,CDC*pDC);

    };

    IMPLEMENT_SERIAL(CPerson,CObject,1)//第五步:添加MFC的

    IMPLEMENT_SERIAL宏,1是版本号

    void CPerson::Serialize(CArchive& ar)

    {

    if (ar.IsStoring())

    {

    ar<<name<<cellphone<<address<<qqnum;

    }

    else

    {

    ar>>name>>cellphone>>address>>qqnum;

    }

    }

    3----建一个对话框,用来新建名片,插入响应的控件,并关联响应的变量m_name,m_cellphone,m_address,m_qqnum.添加确定的命令响应。

    4----mainfrm里添加弹出对话框的命令响应(doc里),代码如下: void CNcardDoc::OnCreatcard()

    {

    // TODO: Add your command handler code here

    CCreadCard dlg;

    if (dlg.DoModal()==IDOK)

    {

    CPerson *pPenson=new CPerson;//建立一个person的对象pPenson->name=dlg.m_name; //获得外部的信息

    pPenson->cellphone=dlg.m_cellphone;

    pPenson->address=dlg.m_address;

    pPenson->qqnum=dlg.m_qqnum;

    m_stuObArray.Add(pPenson); //保存到一个集合里,此处要先建立一个CObArray对象---------m_stuObArray;

    SetModifiedFlag();

    UpdateAllViews(NULL);

    }

    }

    5---view里根据保存对象内容的个数显示出来,在ondraw里添加代码: int y=0;

    for (int nIndex =0;nIndex<pDoc->GetAllRecNum();nIndex++) {

    pDoc->GetStudentAt(nIndex)->Display(y,pDC);

    y+=16;

    }

    其中:GetAllRecNum()获得元素个数

    int CNcardDoc::GetAllRecNum()

    {

    return m_stuObArray.GetSize();

    }

    CPerson* CNcardDoc::GetStudentAt(int nIndex) //还没想清楚是干嘛的,先用着

    {

    if ((nIndex<0)||nIndex>m_stuObArray.GetUpperBound())return 0; //超界处理

    return(CPerson*)m_stuObArray.GetAt(nIndex);

    }

    Display是个用作显示的函数:

    void CPerson::Display(int y,CDC*pDC)

    {

    CString str;

    str.Format("%s%s %s%s %s%s %s%s","姓名:",name,"手机号码:",cellphone,"地

    址:",address,"qq号码",qqnum);

    pDC->TextOut(0,y,str);

    }

    6----最后在doc的序列化函数中加入代码:

    if (ar.IsStoring())

    {

    // TODO: add storing code here

    m_stuObArray.Serialize(ar);

    }

    else

    {

    // TODO: add loading code here

    m_stuObArray.Serialize(ar);

    }

    即可完成一个可保存名片信息文件的程序。如果要自定义自己的名片文件,为其加上后缀,可在字串表资源中修改mainfrm的参数。可对比修改前后的内容:

    ncard\n名片夹\nNcard\n名片文件(*.mp)\n.mp\nNcard.Document\nNcard Document

    我把我做的名片后缀为.mp,哈哈~这样就最终做成了一个属于自己的文件格式。

    查看文档来源:http://blog.sina.com.cn/s/blog_47522f7f0100eqxk.html

    篇二:MFC实验六 文档视图和单文档界面

    实验六文档/视图和单文档界面

    1. 创建一个单文档界面应用程序,项目名设置为wx03.

    2. 在文档类CWx03Doc中添加数据成员用于保存应用程序的数据。

    二维数组m_clrGrid用于保存每个方格的颜色,数据成员m_clrCurrentColor用于保存方格被单击时赋给方格的颜色。

    3. 在文档类CWx03Doc的OnNewDocument函数中对数据成员进行初始化:

    4. 向类wx03Doc添加三个成员函数,如下:

    函数定义如下:

    GetCurrentColor、GetSquare和SetSquare作为文档和视图之间的桥梁,视图对象通过它们可以访问文档的保护成员。

    5. 编辑CWx03View的OnDraw函数,在视图窗口中绘制网格,并根据文档类中保存的方格

    颜色来设置方格的颜色。

    6. 在视图类CWx03View中添加消息处理函数WM_LBUTTONDOWN的处理函数:

    7. 利用菜单编辑器编辑个添加如下菜单,各菜单的属性设置如下表:

    8.

    9. 为添加的菜单项添加命令消息处理函数和用户界面更新命令处理函数。由于这些函数都

    是针对文档数据的操作,因此将这些菜单命令的消息处理函数添加在文档类中。

    10. 编译、链接和运行程序,结果如下:

    11. 添加序列化功能,将各个方格的颜色以及当前颜色存入文件,并允许从文件中读取。

    篇三:单文档应用程序

    单文档 多文档

    1. CMainFrame类是MFC的CFrameWnd类的派生类,它主要负责创建标题栏、菜单栏、工具栏和状态栏。

    AssertValid 诊断CMainFrame对象是否有效,调试用。

    Dump输出CMainFrame对象的状态信息,调试用。

    Oncreate 创建工具栏和状态栏。视图窗口是由基类Cframewnd的成员函数oncreate通过调用oncreateclient函数创建。

    2. Doc文档是MFC的cdocument类的派生类,他主要负责应用程序数据的保存和装载,实现文档的序列化功能。

    OnNewDocument 当用户执行File菜单中New命令时,MFC应用程序框架会调用此函数来完成新建文档的工作。

    Serialize 负责文档数据的磁盘读写操作。

    注意:由于单文档应用程序只处理一个文档对象,当执行New命令时,文档对象已经生成,因此文档类的构造函数不会再调用,所以不会在构造函数中进行文档对象成员变量的初始化,而应在OnNewDocument函数中。在重载时首先需要调用基类CDocument的OnNewDocument函数。

    3(本文来自:www.hnBoXu.COM 博 旭范文 网:mfc单文档序列化).View视图是负责客户区文档数据的显示,以及如何进行人机交互(从CDocument派生的类接受信息并向用户显示,同时用户的输入信息通过它向由CDocument派生的类传递)。

    GetDoument 用于获取当前文档对象的指针

    OnDraw 虚函数,扶着文档对象的数据在用户视图区的显示输出。

    4.WinMain函数

    5.Mfc应用程序运行机制

    调用CWinApp的构造函数-》程序入口函数winmain接受控制-》WinMain函数调用应用程序类的InitInstance函数-》WinMain函数今天消息循环-》程序终止

    相关热词搜索:文档 序列化 mfc mfc单文档mscomm mfc单文档编程