按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 章才会用到
它们。