友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第138章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!