case 2:
return m_message2;
case 3:
return m_message3;
default:
return " ";
}
}
void CMessages::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar.IsStoring())
{
ar << m_message1 << m_message2 << m_message3;
}
else
{
ar >> m_message1 >> m_message2 >> m_message3;
}
}
在SetMessage( )和GetMessage( )函数中没有任何技巧,它们精确地完成所给予的任务。不过在Serialize( )函数中可能会产生一些
问题。首先,注意函数体的第一行调用了基类的Serialize( )函数。这是一个标准的基类函数的重载函数。在本例中,对CObject::Serialize( )的函数调用没做多少事情,这是因为CObject类的Serialize( )函数为空。尽管如此,调用基类的Serialize( )函数是一个需要养成的好习惯,因为你建立的持久类不总是直接由CObject类派生的。
在调用的此函数基类版本后,Serialize( )用与文档对象相同的方式进行数据的保存和加载。因为必须串行化的数据成员是CString对象。程序可以使用>>和<<运算符将字符串写入磁盘。
在messages.cpp的顶部,include语句之后,添加下面的代码行:
IMPLEMENT_SERIAL(CMessages,CObject,0)
IMPLEMENT_SERIAL宏与DECLARE_SLRIAL( )组成一对,它提供了使类具有持续能力的函数的实现。此宏的三个变元是类名、直接基类名和方案号。方案号类似一个版本号。在多数情况下,可使用0或1作为方案号。
☆ 在程序中使用CMessages类
现在CMessages已经被定义和实现了,MultiString的文档和视图的成员函数也已经可以执行了。首先扩展CMultiStringDoc,双击OnNewDocument( )编辑它。将下面的代码添加到TODO注释处:
m_messages.SetMessage(1, "Default Message 1");
m_messages.SetMessage(2, "Default Message 2");
m_messages.SetMessage(3, "Default Message 3");
由于文档类不能直接访问数据对象的数据成员,它必须通过调用CMessages类的SetMessage( )成员函数来初始化每一个字符串。
扩展CMultiStringView,双击OnDraw( )函数,按下面的代码行来编辑它:
void CMultiStringView::OnDraw(CDC* pDC)
{
CMultiStringDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(20, 20, pDoc->m_messages.GetMessage(1));
pDC->TextOut(20, 40, pDoc->m_messages.GetMessage(2));
pDC->TextOut(20, 60, pDoc->m_messages.GetMessage(3));
}
与在创建File Demo时所作的类似,添加“Change Message”项目到Edit菜单中。将它与名为OnEditChangemessages的函数相关联。这个函数将会通过调用CMessages对象的成员函数来修改数据,如程序清单7所示。视图类函数OnDraw( )同样调用GetMessage( )成员函数,以访问CMessages类的串。
程序清单7 编辑数据串
void CMultiSt