e Demo程序类似,当用户选择File|Save或File|Open时可以保存或加载文档。
与创建File Demo程序类似,创建一个名为MultiString的SDI应用程序。添加一个成员变量到文档中,使得MultiStringDoc.h的Attributes部分如下所示:
//Attributes
public:
CMessages m_messages;
下一步就是编写CMessage类。
☆ CMessages类一览
在理解文档类如何成功实现保存和加载其内容之前,需要了解CMessages类是如何工作的,文档类的m_messages数据成员是该类的一个对象。在查看此类时,将看到上面提到的创建持久类所需的五个步骤是如何实现的。
要想创建CMessages类,首先选择Insert|New Class。修改其类类型为普通类,并命名为CMessages。在屏幕的下部,选择CObject作为基类名,并将As列设置为public,这样将创建两个文件:messages.h作为头文件,messages.cpp作为代码文件。同时还有一些简单的代码被添加到这些文件中(这时候可能会有一条警告信息,找不到CObject的头文件,单击OK忽略它。因为CObject像所有MFC文件一样,不需要包含额外的处理就是可用的)。
切换到Multistringdoc.h中,将下面的代码行添加到类定义部分:
#include "Messages.h"
这就保证了编辑器知道CMessages类的存在。现在切换回Messages.h,在其中添加下面的代码行:
DECLARE_SERIAL(CMessages)
protected:
CString m_message1;
CString m_message2;
CString m_message3;
public:
void SetMessage(UINT msgNum, CString msg);
CString GetMessage(UINT msgNum);
void Serialize(CArchive& ar);
DECLARE_SERIAL( )宏提供了实现对象持久性所需的附加的函数和成员变量声明。
下一步是类的数据成员,它们是Cstring类的三个对象。请注意它们现在是protected性质的成员变量。其后是public类型的成员函数。SetMessage( )函数的变元为需设置的字符串的索引号和字符串的新值,该函数使得程序能够改变一个数据成员。GetMessage( )是一个实现函数,它使得程序能够检索任何字符串的当前值。它的唯一参量是要检索的字符串的索引号。
最后,该类重载Serialize( )函数,在此所有的数据得以保存和加载,Serialize( )函数是一个持久对象的核心,每个持久类以不同方式实现。程序清单6显示了这些新成员函数的代码,将它添加到messages.cpp中。
程序清单6 MESSAGE.CPP—CMessage类的实现文件
void CMessages::SetMessage(UINT msgNum, CString msg)
{
switch (msgNum)
{
case 1:
m_message1 = msg;
break;
case 2:
m_message2 = msg;
break;
case 3:
m_message3 = msg;
break;
}
SetModifiedFlag();
}
CString CMessages::GetMessage(UINT msgNum)
{
switch (msgNum)
{
case 1:
return m_message1;