李sir_Blog

博客园 首页 联系 订阅 管理

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

posted on 2010-06-18 16:55  李sir  阅读(927)  评论(0编辑  收藏  举报