友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
深入浅出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)
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!