按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
…………………………………………………………Page 598……………………………………………………………
第篇 深入 MFC 程式設計
如果我的类别名为CStroke,那么经由
class CStroke : public CObject
{
。。。
DECLARE_SERIAL(CStroke)
}
和
IMPLEMENT_SERIAL(CStroke; CObject; 1)
我就获得了两组和CArchive 读写动作的关键性程序代码:
class CStroke : CObject
{
。。。
friend CArchive& AFXAPI operator》》(CArchive& ar; CStroke* &pOb);
}
CArchive& AFXAPI operator》》(CArchive& ar; CStroke* &pOb)
{ pOb = (CStroke*) ar。ReadObject(RUNTIME_CLASS(CStroke));
return ar; }
好,你看到了,为什么只改写operator》》 ,而没有改写operator》(CArchive& ar; class_name* &pOb)
{ pOb = (class_name*) ar。ReadObject(RUNTIME_CLASS(class_name));
return ar; }
也就是,令CreateObject 函数为NULL ,这才能够使用于抽象类别之中。
在 CObList 中加入 CStroke 以外的类別
Scribble Document 倾印码中的那个代表「旧类别」的8001 一直令我如坐针毡。不知道
什么情况下会出现8002?或是8003?或是什么其它东东。因此,我打算做点测试。除
了CStroke,我打算再加上CRectangle 和CCircle 两个类别,并把其对象挂到CObList
中。这个修改纯粹为了测试不同类别写到文件档中会造成什么后果,没有考虑使用者介
面或任何外围因素,我并不是真打算为Scribble 加上画四方形和画圆形的功能(不过如
537
…………………………………………………………Page 600……………………………………………………………
第篇 深入 MFC 程式設計
果你喜欢,这倒是能够给你作为一个导引),所以我把Step1 拷贝一份,在拷贝版上做
文章。
首先我必须声明CCircle 和CRectangle。在新文件中做这件事当然可以,但考虑到简化
问题,以及它们与CStroke 可能会有彼此前置参考的情况,我还是把它们放在原有的
ScribbleDoc。h 中好了。为了能够! § Serialize! ¨, 它们都必须衍生自CObject , 使用
DECLARE_SERIAL 宏,并改写Serialize 虚拟函数,而且拥有default constructor 。
CRectange 有一个成员变量CRect m_rect,代表四方形的四个点;CCircle 有一个成员变
数CPoint m_center 和一个成员变量UINT m_radius,代表圆心和半径:
#0001 class CRectangle : public CObject
#0002 {
#0003 public:
#0004 CRectangle(CRect rect);
#0005
#0006 protected:
#0007 CRectangle();
#0008 DECLARE_SERIAL(CRectangle)
#0009
#0010 // Attributes
#0011 CRect m_rect;
#0012
#0013 public:
#0014 virtual void Serialize(CArchive& ar);
#0015 };
#0016
#0017 class CCircle : public CObject
#0018 {
#0019 public:
#0020 CCircle(CPoint center; UINT radius);
#0021
#0022 protected:
#0023 CCircle();
#0024 DECLARE_SERIAL(CCircle)
#0025
#0026 // Attributes
#0027 CPoint m_center;
#0028 UINT m_radius;
#0029
#0030 public:
#0031 virtual void Serialize(CArchive& ar);
#0032 };
538
…………………………………………………………Page 601……………………………………………………………
第8章 Document…View 深入探討
接下来我必须在ScribbleDoc。cpp 中使用IMPLEMENT_SERIAL 宏,并定义成员函数。
手册上要求每一个Serializable 类别都应该准备一个空的构造式(default constructor )。
照着做吧,免得将来遗憾:
#0001 IMPLEMENT_SERIAL(CRectangle; CObject; 1)
#0002
#0003 CRectangle::CRectangle()
#0004 {
#0005 // this empty constructor should be used by serialization only
#0006 }
#0007
#0008 CRectangle::CRectangle(CRect rect)
#0009 {
#0010 m_rect = rect;
#0011 }
#0012
#0013 void CRectangle::Serialize(CArchive& ar)
#0014 {
#0015 if (ar。IsStoring())
#0016 {
#0017 ar 》 m_rect;
#0022 }
#0023 }
#0024
#0025 IMPLEMENT_SERIAL(CCircle; CObject; 1)
#0026
#0027 CCircle::CCircle()
#0028 {
#0029 // this empty constructor should be used by serialization only
#0030 }
#0031
#0032 CCircle::CCircle(CPoint center; UINT radius)
#0033 {
#0034 m_radius = radius;
#0035 m_center = center;
#0036 }
#0037
#0038 void CCircle::Serialize(CArchive& ar)
#0039 {
#0040 if (ar。IsStoring())
539
…………………………………………………………Page 602……………………………………………………………
第篇 深入 MFC 程式設計
#0041 {
#0042 ar