SCRIBVW.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // ScribVw.cpp : implementation of the CScribbleView class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "Scribble.h"
  14. #include "ScribDoc.h"
  15. #include "ScribVw.h"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CScribbleView
  23. IMPLEMENT_DYNCREATE(CScribbleView, CScrollView)
  24. BEGIN_MESSAGE_MAP(CScribbleView, CScrollView)
  25. //{{AFX_MSG_MAP(CScribbleView)
  26. ON_WM_LBUTTONDOWN()
  27. ON_WM_LBUTTONUP()
  28. ON_WM_MOUSEMOVE()
  29. //}}AFX_MSG_MAP
  30. // Standard printing commands
  31. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  32. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  33. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CScribbleView construction/destruction
  37. CScribbleView::CScribbleView()
  38. {
  39. // TODO: add construction code here
  40. }
  41. CScribbleView::~CScribbleView()
  42. {
  43. }
  44. BOOL CScribbleView::PreCreateWindow(CREATESTRUCT& cs)
  45. {
  46. // TODO: Modify the Window class or styles here by modifying
  47. //  the CREATESTRUCT cs
  48. return CView::PreCreateWindow(cs);
  49. }
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CScribbleView drawing
  52. void CScribbleView::OnDraw(CDC* pDC)
  53. {
  54. CScribbleDoc* pDoc = GetDocument();
  55. ASSERT_VALID(pDoc);
  56. // Get the invalidated rectangle of the view, or in the case
  57. // of printing, the clipping region of the printer dc.
  58. CRect rectClip;
  59. CRect rectStroke;
  60. pDC->GetClipBox(&rectClip);
  61. // Note: CScrollView::OnPaint() will have already adjusted the
  62. // viewport origin before calling OnDraw(), to reflect the
  63. // currently scrolled position.
  64. // The view delegates the drawing of individual strokes to
  65. // CStroke::DrawStroke().
  66. CTypedPtrList<CObList,CStroke*>& strokeList = pDoc->m_strokeList;
  67. POSITION pos = strokeList.GetHeadPosition();
  68. while (pos != NULL)
  69. {
  70. CStroke* pStroke = strokeList.GetNext(pos);
  71. rectStroke = pStroke->GetBoundingRect();
  72. if (!rectStroke.IntersectRect(&rectStroke, &rectClip))
  73. continue;
  74. pStroke->DrawStroke(pDC);
  75. }
  76. }
  77. /////////////////////////////////////////////////////////////////////////////
  78. // CScribbleView printing
  79. BOOL CScribbleView::OnPreparePrinting(CPrintInfo* pInfo)
  80. {
  81. // default preparation
  82. return DoPreparePrinting(pInfo);
  83. }
  84. void CScribbleView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  85. {
  86. // TODO: add extra initialization before printing
  87. }
  88. void CScribbleView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  89. {
  90. // TODO: add cleanup after printing
  91. }
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CScribbleView diagnostics
  94. #ifdef _DEBUG
  95. void CScribbleView::AssertValid() const
  96. {
  97. CScrollView::AssertValid();
  98. }
  99. void CScribbleView::Dump(CDumpContext& dc) const
  100. {
  101. CScrollView::Dump(dc);
  102. }
  103. CScribbleDoc* CScribbleView::GetDocument() // non-debug version is inline
  104. {
  105. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CScribbleDoc)));
  106. return (CScribbleDoc*)m_pDocument;
  107. }
  108. #endif //_DEBUG
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CScribbleView message handlers
  111. void CScribbleView::OnLButtonDown(UINT, CPoint point)
  112. {
  113. // Pressing the mouse button in the view window starts a new stroke
  114. // CScrollView changes the viewport origin and mapping mode.
  115. // It's necessary to convert the point from device coordinates
  116. // to logical coordinates, such as are stored in the document.
  117. CClientDC dc(this);
  118. OnPrepareDC(&dc);
  119. dc.DPtoLP(&point);
  120. m_pStrokeCur = GetDocument()->NewStroke();
  121. // Add first point to the new stroke
  122. m_pStrokeCur->m_pointArray.Add(point);
  123. SetCapture();       // Capture the mouse until button up.
  124. m_ptPrev = point;   // Serves as the MoveTo() anchor point for the
  125. // LineTo() the next point, as the user drags the
  126. // mouse.
  127. return;
  128. }
  129. void CScribbleView::OnLButtonUp(UINT, CPoint point)
  130. {
  131. // Mouse button up is interesting in the Scribble application
  132. // only if the user is currently drawing a new stroke by dragging
  133. // the captured mouse.
  134. if (GetCapture() != this)
  135. return; // If this window (view) didn't capture the mouse,
  136. // then the user isn't drawing in this window.
  137. CScribbleDoc* pDoc = GetDocument();
  138. CClientDC dc(this);
  139. // CScrollView changes the viewport origin and mapping mode.
  140. // It's necessary to convert the point from device coordinates
  141. // to logical coordinates, such as are stored in the document.
  142. OnPrepareDC(&dc);  // set up mapping mode and viewport origin
  143. dc.DPtoLP(&point);
  144. CPen* pOldPen = dc.SelectObject(pDoc->GetCurrentPen());
  145. dc.MoveTo(m_ptPrev);
  146. dc.LineTo(point);
  147. dc.SelectObject(pOldPen);
  148. m_pStrokeCur->m_pointArray.Add(point);
  149. // Tell the stroke item that we're done adding points to it.
  150. // This is so it can finish computing its bounding rectangle.
  151. m_pStrokeCur->FinishStroke();
  152. // Tell the other views that this stroke has been added
  153. // so that they can invalidate this stroke's area in their
  154. // client area.
  155. pDoc->UpdateAllViews(this, 0L, m_pStrokeCur);
  156. ReleaseCapture();   // Release the mouse capture established at
  157. // the beginning of the mouse drag.
  158. return;
  159. }
  160. void CScribbleView::OnMouseMove(UINT, CPoint point)
  161. {
  162. // Mouse movement is interesting in the Scribble application
  163. // only if the user is currently drawing a new stroke by dragging
  164. // the captured mouse.
  165. if (GetCapture() != this)
  166. return; // If this window (view) didn't capture the mouse,
  167. // then the user isn't drawing in this window.
  168. CClientDC dc(this);
  169. // CScrollView changes the viewport origin and mapping mode.
  170. // It's necessary to convert the point from device coordinates
  171. // to logical coordinates, such as are stored in the document.
  172. OnPrepareDC(&dc);
  173. dc.DPtoLP(&point);
  174. m_pStrokeCur->m_pointArray.Add(point);
  175. // Draw a line from the previous detected point in the mouse
  176. // drag to the current point.
  177. CPen* pOldPen = dc.SelectObject(GetDocument()->GetCurrentPen());
  178. dc.MoveTo(m_ptPrev);
  179. dc.LineTo(point);
  180. dc.SelectObject(pOldPen);
  181. m_ptPrev = point;
  182. return;
  183. }
  184. void CScribbleView::OnUpdate(CView* /* pSender */, LPARAM /* lHint */,
  185. CObject* pHint)
  186. {
  187. // The document has informed this view that some data has changed.
  188. if (pHint != NULL)
  189. {
  190. if (pHint->IsKindOf(RUNTIME_CLASS(CStroke)))
  191. {
  192. // The hint is that a stroke as been added (or changed).
  193. // So, invalidate its rectangle.
  194. CStroke* pStroke = (CStroke*)pHint;
  195. CClientDC dc(this);
  196. OnPrepareDC(&dc);
  197. CRect rectInvalid = pStroke->GetBoundingRect();
  198. dc.LPtoDP(&rectInvalid);
  199. InvalidateRect(&rectInvalid);
  200. return;
  201. }
  202. }
  203. // We can't interpret the hint, so assume that anything might
  204. // have been updated.
  205. Invalidate(TRUE);
  206. return;
  207. }
  208. void CScribbleView::OnInitialUpdate()
  209. {
  210. SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
  211. CScrollView::OnInitialUpdate();
  212. }