1:在D/v结构中, 数据都放在一份document中。我们只要把其中的成员变量依次写进文件即可。成员变量很可能是一个对象。而面向对象,我们首先应该记载其类名称,然后才是对象中的数据。读档就有点麻烦了。档程序从文件中读到一个类名称时,它如何实现一个对象,这需要动态创建技术。
mfc有一套Serialize机制。目的在于把文件名的选择。文件的开关。缓存区的建立。数据的读写,提取运算符,插入运算符的重载,对象的动态创建等都包装起来。
2:CObListmfc提供的类。是一个链表,可放置任何从CObject派生下来的对象。
我们可以在每次记录对象内容的时候。先写入一个代码。表示此对象的类是否曾在文件中记录过了。如果是新类,乖乖的记录其类名称。如果是旧类则以代码表示。这样可以节省文件爱你大小以及程序用于解析的时间,还有一个问题。文件的版本如何控制。旧版程序读取新版文件。新版程序读取旧版文件。都可能出问题,最好把版本号码记录上去。最好是每个类都有自己的版本号码。
if(ar.isStoring())
{
ar<<m_sizeDoc;
else
ar>>m_sizeDoc;
m_graphList.serialize(ar);
}
每一个可写到文件或可从文件中读出的类。都应该有它自己的serailize函数。负责它自己的数据读写文件操作。此类应该改写<<运算符和>>运算符。把数据导流到archive中,archive是一个和文件息息相关的缓冲区。
要将<<和>>两个运算符重载。还要让serialize放入类声明中。可以使用Declare_serial/Implement_serial宏。
#Define declare serial(class_name)
Declare_dyncreate(class_name)\
Friend CArchive&Afxapi operator>>(CArchive& ar,class_name* &pob);
为了在每一个对象被处理(读或写)之前,能够处理琐碎的工作。CRuntimeClass需要两个函数Load和store
3:message mapping(消息映射)
Begin_message_map(theclass,baseclass)
on_command(id,memberFxn)
End_message_map
mfc对于消息循环的规定是
<1>:如果是一般的windows消息(WM_XXX),则一定是由派生类流向基类,没有旁流的可能。
<2>:如果是命令消息Wm_Command,那就有奇特的路线了。
命令消息接收者的类型 处理次序
Frame窗口 1: View
2:Frame窗口本身
3:CWinAPP对象
view 1:view 本身
2:document
Document 1:Document本身
2:Document template