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

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

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



                    #0057          ASSERT_VALID(pDoc); 

                    #0058 

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

                    #0060          // CStroke::DrawStroke()。 

                    #0061          CTypedPtrList& strokeList = pDoc…》m_strokeList; 

                    #0062          POSITION pos = strokeList。GetHeadPosition(); 

                    #0063          while (pos != NULL) 

                    #0064          { 

                    #0065                  CStroke* pStroke = strokeList。GetNext(pos); 

                    #0066                  pStroke…》DrawStroke(pDC); 

                    #0067          } 

                    #0068  } 

                    #0069 

                    #0070  /////////////////////////////////////////////////////////////// 

                    #0071  // CScribbleView printing 

                    #0072 

                    #0073  BOOL CScribbleView::OnPreparePrinting(CPrintInfo* pInfo) 

                    #0074  { 

                    #0075          // default preparation 

                    #0076          return DoPreparePrinting(pInfo); 



490 


…………………………………………………………Page 553……………………………………………………………

                                                   第8章    Document…View  深入探討 



#0077  } 

#0078 

#0079  void CScribbleView::OnBeginPrinting(CDC* /*pDC*/; CPrintInfo* /*pInfo*/) 

#0080  { 

#0081          // TODO: add extra initialization before printing 

#0082  } 

#0083 

#0084  void CScribbleView::OnEndPrinting(CDC* /*pDC*/; CPrintInfo* /*pInfo*/) 

#0085  { 

#0086          // TODO: add cleanup after printing 

#0087  } 

#0088 

#0089  ///////////////////////////////////////////////////////////////// 

#0090  // CScribbleView diagnostics 

#0091 

#0092  #ifdef _DEBUG 

#0093  void CScribbleView::AssertValid() const 

#0094  { 

#0095          CView::AssertValid(); 

#0096  } 

#0097 

#0098  void CScribbleView::Dump(CDumpContext& dc) const 

#0099  { 

#0100          CView::Dump(dc); 

#0101  } 

#0102 

#0103  CScribbleDoc* CScribbleView::GetDocument() // non…debug version is inline 

#0104  { 

#0105          ASSERT(m_pDocument…》IsKindOf(RUNTIME_CLASS(CScribbleDoc))); 

#0106          return (CScribbleDoc*)m_pDocument; 

#0107  } 

#0108  #endif //_DEBUG 

#0109 

#0110  //////////////////////////////////////////////////////////////// 

#0111  // CScribbleView message handlers 

#0112 

#0113  void CScribbleView::OnLButtonDown(UINT; CPoint point) 

#0114  { 

#0115      // Pressing the mouse button in the view window starts a new stroke 

#0116 

#0117          m_pStrokeCur = GetDocument()…》NewStroke(); 

#0118          // Add first point to the new stroke 

#0119          m_pStrokeCur…》m_pointArray。Add(point); 

#0120 

#0121          SetCapture();       // Capture the mouse until button up。 

#0122          m_ptPrev = point;   // Serves as the MoveTo() anchor point 

#0123                                 // for the LineTo() the next point; 

#0124                          // as the user drags the mouse。 



                                                                                    491 


…………………………………………………………Page 554……………………………………………………………

                   第篇    深入  MFC  程式設計 



                    #0125 

                    #0126          return; 

                    #0127  } 

                    #0128 

                    #0129  void CScribbleView::OnLButtonUp(UINT; CPoint point) 

                    #0130  { 

                    #0131          // Mouse button up is interesting in the Scribble application 

                    #0132          // only if the user is currently drawing a new stroke by dragging 

                    #0133          // the captured mouse。 

                    #0134 

                    #0135          if (GetCapture() != this) 

                    #0136               return; // If this window (view) didn't capture the mouse; 

                    #0137                        // then the user isn't drawing in this window。 

                    #0138 

                    #0139          CScribbleDoc* pDoc = GetDocument(); 

                    #0140 

                    #0141          CClientDC dc(this); 

                    #0142 

                    #0143          CPen* pOldPen = dc。SelectObject(pDoc…》GetCurrentPen()); 

                    #0144          dc。MoveTo(m_ptPrev); 

                    #0145          dc。LineTo(point); 

                    #0146          dc。SelectObject(pOldPen); 

                    #0147          m_pStrokeCur…》m_pointArray。Add(point); 

                    #0148 

                    #0149          ReleaseCapture();  // Release the mouse capture established at 

                    #0150                                // the beginning of the mouse drag。 

                    #0151          return; 

                    #0152  } 

                    #0153 

                    #0154  void CScribbleView::OnMouseMove(UINT; CPoint point) 

                    #0155  { 

                    #0156          // Mouse movement is interesting in the Scribble application 

                    #0157          // only if the user is currently drawing a new stroke by dragging 

                    #0158          // the captured mouse。 

                    #0159 

                    #0160          if (GetCapture() != this) 

                    #0161               return; // If this window (view) didn't capture the mouse; 

                    #0162                        // then the user isn't drawing in this window。 

                    #0163 

                    #0164          CClientDC dc(this); 

                    #0165          m_pStrokeCur…》m_pointArray。Add(point); 

                    #0166 

                    #0167          // Draw a line from the previous detected point in the mouse 

                    #0168          // drag to the current point。 

                    #0169          CPen* pOldPen = dc。SelectObject(GetDocument()…》GetCurrentPen()); 

                    #0170          dc。MoveTo(m_ptPrev); 

                    #0171          dc。LineTo(point); 

                    #0172          dc。SelectObject(pOldPen); 



492 


…………………………………………………………Page 555……………………………………………………………

                                                    第8章    Document…View  深入探討 



    #0173          m_ptPrev = point; 

    #0174          return; 

    #0175  } 



View 的重绘动作:GetDocument 和OnDraw 



    以下是CScribbleView 中与重绘动作有关的成员变量和成员函数。 



 CScribbleView 的成员变量 



      m_pStrokeCur :一个指针,指向目前正在工作的线条。 



      m_ptPrev :线条中的前一个工作点。我们将在这个点与目前鼠标按下的点之间 



      画一条直线。虽说理想情况下鼠标轨迹的每一个点都应该被记录下来,但如果 



       鼠标移动太快来不及记录,只好在两点之间拉直线。 



        

 CScribbleView 的成员函数 



     OnDraw :这是一个虚拟函数,负责将Document  的数据显示出来。改写它是程 



        

     式员最大的责任之一。 



     GetDocument:AppWizard 为我们做出这样的码,以inline 方式定义于头文件: 



       inline CScribbleDoc* CScribbleView::GetDocument() 



           { return (CScribbleDoc*)m_pDocument; } 



      其中m_pDocument 是CView 的成员变量。我们可以推测,当程序设定好Document 



      Template 之后,每次Framework 动态产生View 对象,其内的m_pDocument  已经被 



      Framework 设定指向对应之Document  了。 



        View 对象何时被动态产生?答案是当使用者选按【File/Open 】或【File/New 】。每 



        当产生一个Document ,就会产生一组Document/View/Frame          「三口组」。 



      OnPreparePrinting,OnBeginPrinting,OnEndPrinting:这三个CView 虚拟函数将 



       用来改善打印行为。AppWizard  只是先帮我们做出空函数。第12 章才会用到 



       它们。 



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