友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

深入浅出MFC第2版(PDF格式)-第101部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



…………………………………………………………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  m_center; 

                    #0048                  ar 》》 m_radius; 

                    #0049          } 

                    #0050  } 



                   接下来我应该改变使用者接口,加上菜单或工具栏,以便在涂鸦过程中得随时加上一个 



                    四方形或一个圆圈。但我刚才说了,我只是打算做个小小的文件档格式测试而已,所以 



                    简单化是我的最高指导原则。我打算搭现有之使用者接口的便车,也就是每次鼠标左键 



                   按下开始一条线条之后,再new 一个四方形和一个圆形,并和线条一起加入CObList 之 



                    中,然后才开始接受左键的坐标。。。。 



                   所以,我修改CScribDoc::NewStroke 函数如下: 



                    #0001  CStroke* CScribDoc::NewStroke() 

                    #0002  { 

                    #0003      CStroke* pStrokeItem = new CStroke(m_nPenWidth); 

                    #0004      CRectangle* pRectItem = new CRectangle(CRect(0x11;0x22;0x33;0x44)); 

                    #0005      CCircle* pCircleItem = new CCircle(CPoint(0x55;0x66);0x77); 

                    #0006      m_strokeList。AddTail(pStrokeItem); 

                    #0007      m_strokeList。AddTail(pRectItem); 

                    #0008      m_strokeList。AddTail(pCircleItem); 

                    #0009 

                    #0010      SetModifiedFlag();  // Mark the document as having been modified; 

                    #0011                          // for purposes of confirming File Close。 

                    #0012      return pStrokeItem; 

                    #0013  } 



                    并将scribbledoc。h 中的m_strokeList 修改为: 



                    CTypedPtrList m_strokeList; 



                   重新编译联结,获得结果如图8…10a 。图8…10b 对此结果有详细的剖析。 



540 


…………………………………………………………Page 603……………………………………………………………

                                                  第8章    Document…View  深入探討 



                                                            每画上一条线条,就自动附 



                                                            加一个矩形和一个圆形。本 



                                                            例并没有另外设计UI,纯为 



 CArchive::WriteObject                                      实验用途。 



                                                                 CArchive::ReadObject 



              06 00 FF FF 

     000000:              01 00 07 00  43 53 74 72 6F 6B 65 02 。。。。。。。。CStroke。 

     000010: 00 02 00 6E 00 00 00 24  00 00 00 6E 00 00 00 24 。。。n。。。。。。n。。。 

     000020: 00 00 00 FF FF 01 00 0A  00 43 52 65 63 74 61 6E 。。。。。。。。。CRectan 

     000030: 67 6C 65 11 00 00 00 22  00 00 00 33 00 00 00 44 gle。。。。〃。。。3。。。D 

     000040: 00 00 00 FF FF 01 00 07  00 43 43 69 72 63 6C 65 。。。。。。。。。CCircle 

     000050: 55 00 00 00 66 00 00 00  77 00 00 00 01 80 02 00 U。。。f。。。w。。。。。。。 

     000060: 02 00 6E 00 00 00 55 00  00 00 6E 00 00 00 55 00 。。n。。。U。。。n。。。U。 

     000070: 00 00 03 80 11 00 00 00  22 00 00 00 33 00 00 00 。。。。。。。。〃。。。3。。。 

     000080: 44 00 00 00 05 80 55 00  00 00 66 00 00 00 77 00 D。。。。。U。。。f。。。w。 

     000090: 00 00                                            。。 



      图8…10a TEST。SCB 文件内容,文件全长146 个字节。 



 CObList m_graphList 

  CObList m_graphList 



每次鼠标左键按下,开始一条线条,图8…10a 中的程序立刻new 一个四方形和一个圆 



形,并和线条一起加入CObList 之中,然后才开始接受左键的坐标。所以图8…10a 的 



执行画面造成本图的数据结构。 



                                                                                    541 


…………………………………………………………Page 604……………………………………………………………

                       第篇    深入  MFC  程式設計 



                        数值(hex)              说明 



                        0006                         表示此文件有六个CObList 元素 



                        FFFF                                        FFFF 亦即…1,表示New Class Tag 



                        0001                                         这是Schema no。,代表资料的版本号码 



                        0007                                         表示后面接着的「类别名称」有7 个字符 



                        43 53 74 72 6F 6B 65              〃CStroke〃  (类别名称)的ASCII 码 



                        0002                                          第一条线条的宽度 



                        0002                                          第一条线条的点数组大小(点数) 



                        00000066;0000001B                 第一条线条的第一个点坐标 



                        00000066;0000001B                 第一条线条的第二个点坐标 



                        FFFF                                          FFFF 亦即…1,表示New Class Tag 



                        0001                                           这是Schema no。,代表资料的版本号码。 



                        000A                                          后面接着的「类别名称」有Ah 个字符。 



                        43 52 65 63 74 61 6E 67 6C 65   〃CRectangle〃   (类别名称)的ASCII 码。 



                        00000011                  第一个四方形的左 



                        00000022                                   第一个四方形的上 



                        00000033                  第一个四方形的右 



                        00000044                                    第一个四方形的下 



                        FFFF                                           FFFF 亦即…1,表示New Class Tag 



                        0001                       这是Schema no。,代表资料的版本号码。 



                        0007                       后面接着的「类别名称」有7 个字符。 



                        43 43 69 72 63 6C 65                   〃CCircle〃  (类别名称)的ASCII 码。 



                        00000055                   第一个圆形的中心点X 坐标 



                        00000066                   第一个圆形的中心点Y 坐标 



                        00000077                                     第一个圆形的半径 



                        8001                       这是(wOldClassTag | nClassIndex)  的组合结果,表示接 



                                                  下来的对象使用索引为  的旧类别。 

                                                                                1  



                        0002                                             第二条线条的宽度 



                        0002                        第二条线条的点数组大小(点数) 



542 


…………………………………………………………Page 605……………………………………………………………

                                                      第8章    Document…View  深入探討 



          数值(hex) 
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!