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

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

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





           然是在鼠标左键按下时进入程序之中,也就是利用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 _DEBUG 

                   #0071          virtual void AssertValid() const; 

                   #0072          virtual void Dump(CDumpContext& dc) const; 

                   #0073  #endif 

                   #0074 

                   #0075  protected: 

                   #0076          void  InitDocument(); 

                   #0077 

                   #0078  // Generated message map functions 

                   #0079  protected: 

                   #0080    //{{AFX_MSG(CScribbleDoc) 

                   #0081      // NOTE the ClassWizard will add and remove member functions here。 

                   #0082      //    DO NOT EDIT what you see in these blocks of generated code ! 

                   #0083    //}}AFX_MSG 

                   #0084    DECLARE_MESSAGE_MAP() 

                   #0085  }; 



                   如果你把本书第一版(使用VC++ 4。0 )的Scribble step1 原封不动地在VC++ 4。2 或 



476 


…………………………………………………………Page 539……………………………………………………………

VC++ 5。0  中编译,你会获得好几个编译错误。问题出在SCRIBBLEDOC。H 文件: 



// forward declaration of data structure class 

class CStroke; 



class CScribbleDoc : public CDocument 

{ 

    。。。 

}; 



class CStroke : public CObject 

{ 

    。。。 

}; 



 并不是程序设计上有什么错误,你只要把CStroke 的声明由CScribbleDoc 之后搬移到 



 CScribbleDoc 之前即可。由此观之,VC++ 4。2 和VC++ 5。0  的编译器似乎不支持forward 



 declaration 。真是没道理! 



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



#0001  #include 〃stdafx。h〃 

#0002  #include 〃Scribble。h〃 

#0003 

#0004  #include 〃ScribbleDoc。h〃 

#0005 

#0006  #ifdef _DEBUG 

#0007  #define new DEBUG_NEW 

#0008  #undef THIS_FILE 

#0009  static char THIS_FILE'' = __FILE__; 

#0010  #endif 

#0011 

#0012  ///////////////////////////////////////////////////////////////// 

#0013  // CScribbleDoc 

#0014 

#0015  IMPLEMENT_DYNCREATE(CScribbleDoc; CDocument) 

#0016 

#0017  BEGIN_MESSAGE_MAP(CScribbleDoc; CDocument) 

#0018          //{{AFX_MSG_MAP(CScribbleDoc) 

#0019              // NOTE the ClassWizard will add and remove mapping macros here。 

#0020              // DO NOT EDIT what you see in these blocks of generated code! 

#0021          //}}AFX_MSG_MAP 

#0022  END_MESSAGE_MAP() 

#0023 

#0024  ///////////////////////////////////////////////////////////////// 



                                                                                      477 


…………………………………………………………Page 540……………………………………………………………

                    第篇    深入  MFC  程式設計 



                    #0025  // CScribbleDoc construction/destruction 

                    #0026 

                    #0027  CScribbleDoc::CScribbleDoc() 

                    #0028  { 

                    #0029          // TODO: add one…time construction code here 

                    #0030 

                    #0031  } 

                    #0032 

                    #0033  CScribbleDoc::~CScribbleDoc() 

                    #0034  { 

                    #0035  } 

                    #0036 

                    #0037  BOOL CScribbleDoc::OnNewDocument() 

                    #0038  { 

                    #0039          if (!CDocument::OnNewDocument()) 

                    #0040                  return FALSE; 

                    #0041          InitDocument(); 

                    #0042          return TRUE; 

                    #0043  } 

                    #0044 

                    #0045  ///////////////////////////////////////////////////////////////// 

                    #0046  // CScribbleDoc serialization 

                    #0047 

                    #0048  void CScribbleDoc::Serialize(CArchive& ar) 

                    #0049  { 

                    #0050          if (ar。IsStoring()) 

                    #0051          { 

                    #0052          } 

                    #0053          else 

                    #0054          { 

                    #0055          } 

                    #0056          m_strokeList。Serialize(ar); 

                    #0057  } 

                    #0058 

                    #0059  ///////////////////////////////////////////////////////////////// 

                    #0060  // CScribbleDoc diagnostics 

                    #0061 

                    #0062  #ifdef _DEBUG 

                    #0063  void CScribbleDoc::AssertValid() const 

                    #0064  { 

                    #0065          CDocument::AssertValid(); 

                    #0066  } 

                    #0067 

                    #0068  void CScribbleDoc::Dump(CDumpContext& dc) const 

                    #0069  { 

                    #0070          CDocument::Dump(dc); 

                    #0071  } 

                    #0072  #endif //_DEBUG 



478 


…………………………………………………………Page 541……………………………………………………………

                                                    第8章    Document…View  深入探討 



#0073 

#0074  ///////////////////////////////////////////////////////////////// 

#0075  // CScribbleDoc mands 

#0076 

#0077  BOOL CScribbleDoc::OnOpenDocument(LPCTSTR lpszPathName) 

#0078  { 

#0079          if (!CDocument::OnOpenDocument(lpszPathName)) 

#0080                  return FALSE; 

#0081          InitDocument(); 

#0082          return TRUE; 

#0083  } 

#0084 

#0085  void CScribbleDoc::DeleteContents() 

#0086  { 

#0087          while (!m_strokeList。IsEmpty()) 

#0088          { 

#0089                  delete m_strokeList。RemoveHead(); 

#0090          } 

#0091          CDocument::DeleteContents(); 

#0092  } 

#0093 

#0094  void CScribbleDoc::InitDocument() 

#0095  { 

#0096          m_nPenWidth = 2; // default 2 pixel pen width 

#0097          // solid; black pen 

#0098          m_penCur。CreatePen(PS_SOLID; m_nPenWidth; RGB(0;0;0)); 

#0099  } 

#0100 

#0101  CStroke* CScribbleDoc::NewStroke() 

#0102  { 

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

#0104          m_strokeList。AddTail(pStrokeItem); 

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

#0106                                 // purposes of confirming File Close。 

#0107          return pStrokeItem; 

#0108  } 

#0109 

#0110 

#0111 

#0112 

#0113  //////////////////////////////////////////////////////////////// 

#0114  // CStroke 

#0115 

#0116  IMPLEMENT_SERIAL(CStroke; CObject; 1) 

#0117  CStroke::CStroke() 

#0118  { 

#0119          // This empty constructor should be used by serialization only 

#0120  } 



                                                                                       479 


…………………………………………………………Page 542……………………………………………………………

                    第篇    深入  MFC  程式設計 



                    #0121 

                    #0122  CStroke::CStroke(UINT nPenWidth) 

                    #0123  { 

                    #0124          m_nPenWidth = nPenWidth; 

                    #0125  } 

                    #0126 

                    #0127  void CStroke::Serialize(CArchive& ar) 

                    #0128  { 

                    #0129          if (ar。IsStoring()) 

                    #0130          { 

                    #0131                  ar 》 w; 

                    #0138                  m_nPenWidth = w; 

                    #0139                  m_pointArray。Serialize(ar); 

                    #0140          } 

                    #0141  } 

                    #0142 

                    #0143  BOOL CStroke::DrawStroke(CDC* pDC) 

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