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

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

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



你做大局 



                                观。请注意,虽然本图把「成员函数」和「成员变量」画在每一个对象之中,但你知道, 



                                事实上C++ 类别的成员函数另放在对象内存以外,并不是每一个对象都有一份函数 



。。。                             码。只有non…static 成员变量,才会每个对象各有一份。这个观念我曾在第2章强调过。 



            486 


…………………………………………………………Page 549……………………………………………………………

                                            第8章    Document…View  深入探討 



Scribble Step1 的View :资料重绘与编辑 



      View 有两个最重要的任务,一是负责资料的显示,另一是负责资料的编辑(透过键盘或 



       鼠标)。本例的CScribbleView 包括以下特质: 



        解读CScribbleDoc 中的资料,包括笔宽以及一系列的CPoint 对象,画在View 



         窗口上。 



        允许使用者以鼠标左键充当画笔在View 窗口内涂抹,换句话说CSribbleView 



         必须接受并处理WM_LBUTTONDOWN 、WM_MOUSEMOVE 、WM_LBUTTONUP 



         三个消息。 



      当Framework 收到WM_PAINT ,表示画面需要重绘,它会调用OnDraw     (注),由 



      OnDraw 执行真正的绘图动作。什么时候会产生重绘消息WM_PAINT  呢?当使用者改 



      变窗口大小,或是将窗口图标化之后再恢复原状,或是来自程序(自己或别人)刻意的 



      制造。除了在必须重绘时重绘之外,做为一个绘图软件,Scribble 还必须「实时」反应 



       鼠标左键在窗口上移动的轨迹,不能等到WM_PAINT 产生了才有所反应。所以,我们 



      必须在OnMouseMove 中也做绘图动作,那是针对一个点一个点的绘图,而OnDraw 是 



      大规模的全部重绘。 



      注:其实Framework 是先调用OnPaint,OnPaint 再调用OnDraw 。关于OnPaint,第12 



      章谈到打印机时再说。 



       绘图前当然必须获得资料内容,调用GetDocument 即可获得,它传回一个CScribbleDoc 



       对象指针。别忘了View 和Document  以及Frame 窗口早在注册Document Template 时 



       就建立彼此间的关联了。所以,从CScribbleView 发出的GetDocument 函数当然能够获 



       得CScribbleDoc 的对象指针。View 可以藉此指针取得Document  的资料,然后显示。 



                                                                     487 


…………………………………………………………Page 550……………………………………………………………

             CScribbleView  的修改 



                   以下是Step1 程序的View  的设计。其中有鼠标接口,也有资料显示功能OnDraw 



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



                   #0001  class CScribbleView : public CView 

                   #0002  { 

                   #0003  protected: // create from serialization only 

                   #0004          CScribbleView(); 

                   #0005          DECLARE_DYNCREATE(CScribbleView) 

                   #0006 

                   #0007  // Attributes 

                   #0008  public: 

                   #0009          CScribbleDoc* GetDocument(); 

                   #0010 

                   #0011  protected: 

                   #0012          CStroke*  m_pStrokeCur;  // the stroke in progress 

                   #0013          CPoint    m_ptPrev; // the last mouse pt in the stroke in progress 

                   #0014 

                   #0015  // Operations 

                   #0016  public: 

                   #0017 

                   #0018  // Overrides 

                   #0019          // ClassWizard generated virtual function overrides 

                   #0020          //{{AFX_VIRTUAL(CScribbleView) 

                   #0021          public: 

                   #0022          virtual void OnDraw(CDC* pDC);  // overridden to draw this view 

                   #0023          virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 

                   #0024          protected: 

                   #0025          virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); 

                   #0026          virtual void OnBeginPrinting(CDC* pDC; CPrintInfo* pInfo); 

                   #0027          virtual void OnEndPrinting(CDC* pDC; CPrintInfo* pInfo); 

                   #0028          //}}AFX_VIRTUAL 

                   #0029 

                   #0030  // Implementation 

                   #0031  public: 

                   #0032          virtual ~CScribbleView(); 

                   #0033  #ifdef _DEBUG 

                   #0034          virtual void AssertValid() const; 

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

                   #0036  #endif 

                   #0037 

                   #0038  protected: 

                   #0039 



488 


…………………………………………………………Page 551……………………………………………………………

#0040  // Generated message map functions 

#0041  protected: 

#0042          //{{AFX_MSG(CScribbleView) 

#0043          afx_msg void OnLButtonDown(UINT nFlags; CPoint point); 

#0044          afx_msg void OnLButtonUp(UINT nFlags; CPoint point); 

#0045          afx_msg void OnMouseMove(UINT nFlags; CPoint point); 

#0046          //}}AFX_MSG 

#0047          DECLARE_MESSAGE_MAP() 

#0048  }; 

#0049 

#0050  #ifndef _DEBUG  // debug version in ScribVw。cpp 

#0051  inline CScribbleDoc* CScribbleView::GetDocument() 

#0052     { return (CScribbleDoc*)m_pDocument; } 

#0053  #endif 



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



#0001  #include 〃stdafx。h〃 

#0002  #include 〃Scribble。h〃 

#0003 

#0004  #include 〃ScribbleDoc。h〃 

#0005  #include 〃ScribbleView。h〃 

#0006 

#0007  #ifdef _DEBUG 

#0008  #define new DEBUG_NEW 

#0009  #undef THIS_FILE 

#0010  static char THIS_FILE'' = __FILE__; 

#0011  #endif 

#0012 

#0013  ///////////////////////////////////////////////////////////////// 

#0014  // CScribbleView 

#0015 

#0016  IMPLEMENT_DYNCREATE(CScribbleView; CView) 

#0017 

#0018  BEGIN_MESSAGE_MAP(CScribbleView; CView) 

#0019          //{{AFX_MSG_MAP(CScribbleView) 

#0020          ON_WM_LBUTTONDOWN() 

#0021          ON_WM_LBUTTONUP() 

#0022          ON_WM_MOUSEMOVE() 

#0023          //}}AFX_MSG_MAP 

#0024          // Standard printing mands 

#0025          ON_MAND(ID_FILE_PRINT; CView::OnFilePrint) 

#0026          ON_MAND(ID_FILE_PRINT_DIRECT; CView::OnFilePrint) 

#0027          ON_MAND(ID_FILE_PRINT_PREVIEW; CView::OnFilePrintPreview) 

#0028  END_MESSAGE_MAP() 



                                                                                   489 


…………………………………………………………Page 552……………………………………………………………

                    第篇    深入  MFC  程式設計 



                    #0029 

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

                    #0031  // CScribbleView construction/destruction 

                    #0032 

                    #0033  CScribbleView::CScribbleView() 

                    #0034  { 

                    #0035          // TODO: add construction code here 

                    #0036 

                    #0037  } 

                    #0038 

                    #0039  CScribbleView::~CScribbleView() 

                    #0040  { 

                    #0041  } 

                    #0042 

                    #0043  BOOL CScribbleView::PreCreateWindow(CREATESTRUCT& cs) 

                    #0044  { 

                    #0045          // TODO: Modify the Window class or styles here by modifying 

                    #0046          //  the CREATESTRUCT cs 

                    #0047 

                    #0048          return CView::PreCreateWindow(cs); 

                    #0049  } 

                    #0050 

                    #0051  ///////////////////////////////////////////////////////////////// 

                    #0052  // CScribbleView drawing 

                    #0053 

                    #0054  void CScribbleView::OnDraw(CDC* pDC) 

                    #0055  { 

                    #0056          CScribbleDoc* pDoc = GetDocument(); 

                    #0057          ASSERT_VALID(pDoc); 

                    #0058 

                    #0059          // The view delegates the drawing of individual strokes to 

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