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