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

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






CScribbleDoc 的修改 



       了解了Collection Classes  中各类别的特性以及所谓template/nontemplate 版本之后,以 



       本例之情况而言,很显然: 



         ■不定量的线条数可以利用串行(             linked list )来表示,那么MFC  的CObList 恰 



           可用来表现这样的串行。CObList 规定其每个元素必须是一个「CObject 衍生 



           类别」的对象实体,好啊,没问题,我们就设计一个名为CStroke 的类别, 



           衍生自CObject,代表一条线条。为了type…safe ,我们选择template 版本, 



           所以设计出这样的Document : 



           class CScribbleDoc : public CDocument 



           { 



           。。。 



           public: 



                 CTypedPtrList m_strokeList; 



           。。。 



           } 



         ■线条由笔宽和坐标点构成,所以CStroke 应该有m_nPenWidth 成员变量,但 



           一长串的坐标点以什么来管理好呢?数组是个不错的选择,至于数组内要放什 



           么类型的资料,我们不妨先着一鞭,想想这些坐标是怎么获得的。这些坐标显 



           然是在鼠标左键按下时进入程序之中,也就是利用OnLButtonDown 函数的参 



           数CPoint。CPoint 符合前一节所说的数组元素类型条件,所以CStroke 的成 



           员变量可以这么设计: 



           protected: 

                   UINT m_nPenWidth; 

           public: 

                   CArray  m_pointArray; 

           。。。 

           } 



           至于CPoint 实际内容是什么,就甭管了吧。 



           事实上CPoint 是一个由两个long 组成的结构,两个long 各代表x 和y 坐标。 



                                                                                     473 


…………………………………………………………Page 536……………………………………………………………

                   第篇    深入  MFC  程式設計 



                    CScribble Step1 Document: (本图为了说明方便,以CObList 代替实际使用之CTypedPtrList) 



                                                这是一个CObList      对象 

                    CObList::RemoveHead                    CObList  的每个元素都是一个CObject          指针。 

                    把串行头之CObject 对象指针取出                    我们令它指向CStroke       对象,合法,因为 



                                                           CStroke  衍生自CObject    。 

                         CScribbleDoc 



                      CObList  m_strokeList                                  CObList::AddTail 

                       CObList  m_strokeList 

                     (文件内含一个CObList   串行)                                    把一个CObject   对象指针 



                                                                             放入串行尾端。 



                                                                           这是一个CArray  对象 

                        UINT m_nPenWidth                                  (线条可以「CPoint       数组」表示) 

                         (代表笔的宽度)                                         (屏幕点坐标正是一个CPoint          ) 



                      CArray::Add 

                      把一个元素放入数组中。 

                                                                          CArray  的' '   

                                       这就是一个                                         运算子 

                                                                          可取出数组的元素。 

                                       CStroke   

                                               对象 



                      图8…3a Scribble Step1 的文件由线条构成,线条又由点数组构成 



                                                   CObject 

                                                    CObject 



                       CCmdTarget                CTypedPtrList 

                        CCmdTarget                CTypedPtrList 



                            CDocument                 CArray 

                             CDocument                 CArray 



                               CScribbleDoc         CStroke             : defined in Scribble 

                                CScribbleDoc        CStroke 



                                                     。 



                                  图8…3b Scribble Step1 文件所使用的类别 



474 


…………………………………………………………Page 537……………………………………………………………

CScribbleDoc  内嵌一个CObList 对象,CObList 串行中的每个元素都是一个CStroke 对 



象指针,而CStroke 又内嵌一个CArray 对象。下面是Step1 程序的Document 设计。 



SCRIBBLEDOC。H (阴影表示与Step0的差异) 



#0001  ///////////////////////////////////////////////////////////////// 

#0002  // class CStroke 

#0003  // 

#0004  // A stroke is a series of connected points in the scribble drawing。 

#0005  // A scribble document may have multiple strokes。 

#0006 

#0007  class CStroke : public CObject 

#0008  { 

#0009  public: 

#0010          CStroke(UINT nPenWidth); 

#0011 

#0012  protected: 

#0013          CStroke(); 

#0014          DECLARE_SERIAL(CStroke) 

#0015 

#0016  // Attributes 

#0017  protected: 

#0018          UINT   m_nPenWidth;    // one pen width applies to entire stroke 

#0019  public: 

#0020          CArray  m_pointArray;   // series of connected 

points 

#0021 

#0022  // Operations 

#0023  public: 

#0024          BOOL DrawStroke(CDC* pDC); 

#0025 

#0026  public: 

#0027          virtual void Serialize(CArchive& ar); 

#0028  }; 

#0029 

#0030  ///////////////////////////////////////////////////////////////// 

#0031 

#0032  class CScribbleDoc : public CDocument 

#0033  { 

#0034  protected: // create from serialization only 

#0035          CScribbleDoc(); 

#0036          DECLARE_DYNCREATE(CScribbleDoc) 

#0037 

#0038  // Attributes 

#0039  protected: 



                                                                                     475 


…………………………………………………………Page 538……………………………………………………………

                   第篇    深入  MFC  程式設計 



                   #0040          // The document keeps track of the current pen width on 

                   #0041          // behalf of all views。 We'd like the user interface of 

                   #0042          // Scribble to be such that if the user chooses the Draw 

                   #0043          // Thick Line mand; it will apply to all views; not just 

                   #0044          // the view that currently has the focus。 

                   #0045 

                   #0046          UINT   m_nPenWidth;    // current user…selected pen width 

                   #0047          CPen   m_penCur;       // pen created according to 

                   #0048                                   // user…selected pen style (width) 

                   #0049  public: 

                   #0050          CTypedPtrList     m_strokeList; 

                   #0051          CPen*           GetCurrentPen() { return &m_penCur; } 

                   #0052 

                   #0053  // Operations 

                   #0054  public: 

                   #0055          CStroke* NewStroke(); 

                   #0056 

                   #0057  // Overrides 

                   #0058          // ClassWizard generated virtual function overrides 

                   #0059          //{{AFX_VIRTUAL(CScribbleDoc) 

                   #0060          public: 

                   #0061          virtual BOOL OnNewDocument(); 

                   #0062          virtual void Serialize(CArchive& ar); 

                   #0063          virtual BOOL OnOpenDocument(LPCTSTR lpszPathName); 

                   #0064          virtual void DeleteContents(); 

                   #0065          //}}AFX_VIRTUAL 

                   #0066 

                   #0067  // Implementation 

                   #0068  public: 

                   #0069          virtual ~CScribbleDoc(); 

                   #0070  #ifdef 
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!