单文档与多文档

(A)消息传递:

         当用户选择菜单命令时,消息首先传递给当前的视图,然后传递给当前文档,再传给当前模板,然后传给应用程序。如果消息在传递过程中被处理,那么消息将不再继续传递。在文档、视图应用程序中,经常利用视图类显示图形数据,而在文档类中保存数据。数据的存储一般在CDocument的派生类中进行串行化存储。数据显示在CView中实现。因此得到与视图相关的文档指针是数据显示的前提。

     在文档类中,经常添加数据成员以保存数据,有时在视图类中获取到数据以后需要传递给文档类的数据成员。这时,可以利用this->GetDocument()得到当前文档对象的指针,问候访问其数据成员,保存数据。

(B)消息映射

  消息映射就是用来确定消息到来时那个函数去处理的一个映射集合。MFC的ClassWizard可以为类添加消息映射,但是有一些类并不可以用它来添加,需要用户手动添加。用户添加时应该吧消息映射添加到AFX_MSG_MAP后面。添加映射完成后,就需要在相应类中声明该函数,同时定义函数。

(C)集合类介绍

  MFC类库的集合类包含3种数据结构,分别为:动态链表,动态数组,和字典。########

  动态链表提供有序的,非索引的双向链表。动态数组提供一个大小可变的,整数索引的对象数组。字典则把一个关键字与对象关联起来的集合。

  数组:CtypedPtrArray,链表:CtypedPtrlst;字典:CTyedPtrMap

  模板链表:istance

#include <iostream>
#include <afxtempl.h>//包含头文件

using namespace std;

class BASE
{
    public:
        int x;
        int y;
};

CTypedPtrList <CPtrList,BASE *>m_list;//模板链表

int main()
{
    int i = 0;
    int x;
    int y;
    while(i == 0)
    {
        BASE *base1 = new BASE;
        cin>>x>>y;
        base1->x = x;
        base1->y = y;
        m_list.AddTail(base1);//添加到模板链表的尾部
        cin>>i;
    }
    POSITION pos = m_list.GetHeadPosition();//得到头部位置
    while(pos != NULL)
    {
        BASE *base2 = new BASE;
        base2 = m_list.GetNext(pos);//得到下一位置
        cout<<base2->x<<base2->y<<endl;
    }
    return 0;
}

  串行化:实现数据存储在硬盘中,并可以方便的实现读取。实现对象输入到字节流,或者从字节流中读到对象。

(D)常见问题

1.文档和视图以及框架类通过模板类联系在一起

CDocTemplate(UINT nIDResource,

                   CRuntimeClass * pDocClass,

        CRuntimeClass * pFrameClass,

        CRuntimeClass * pViewClass);

2.可以进行串行化的类必须是由CObject或者其子类进行派生出来的类,并且串行化的输入输出顺序必须完全一致。

原文地址:https://www.cnblogs.com/jiaoluo/p/3451714.html