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

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, CView)
  24. BEGIN_MESSAGE_MAP(CScribbleView, CView)
  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. // The view delegates the drawing of individual strokes to
  57. // CStroke::DrawStroke().
  58. CTypedPtrList<CObList,CStroke*>& strokeList = pDoc->m_strokeList;
  59. POSITION pos = strokeList.GetHeadPosition();
  60. while (pos != NULL)
  61. {
  62. CStroke* pStroke = strokeList.GetNext(pos);
  63. pStroke->DrawStroke(pDC);
  64. }
  65. }
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CScribbleView printing
  68. BOOL CScribbleView::OnPreparePrinting(CPrintInfo* pInfo)
  69. {
  70. // default preparation
  71. return DoPreparePrinting(pInfo);
  72. }
  73. void CScribbleView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  74. {
  75. // TODO: add extra initialization before printing
  76. }
  77. void CScribbleView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  78. {
  79. // TODO: add cleanup after printing
  80. }
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CScribbleView diagnostics
  83. #ifdef _DEBUG
  84. void CScribbleView::AssertValid() const
  85. {
  86. CView::AssertValid();
  87. }
  88. void CScribbleView::Dump(CDumpContext& dc) const
  89. {
  90. CView::Dump(dc);
  91. }
  92. CScribbleDoc* CScribbleView::GetDocument() // non-debug version is inline
  93. {
  94. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CScribbleDoc)));
  95. return (CScribbleDoc*)m_pDocument;
  96. }
  97. #endif //_DEBUG
  98. /////////////////////////////////////////////////////////////////////////////
  99. // CScribbleView message handlers
  100. void CScribbleView::OnLButtonDown(UINT, CPoint point)
  101. {
  102. // Pressing the mouse button in the view window starts a new stroke
  103. m_pStrokeCur = GetDocument()->NewStroke();
  104. // Add first point to the new stroke
  105. m_pStrokeCur->m_pointArray.Add(point);
  106. SetCapture();       // Capture the mouse until button up.
  107. m_ptPrev = point;   // Serves as the MoveTo() anchor point for the
  108. // LineTo() the next point, as the user drags the
  109. // mouse.
  110. return;
  111. }
  112. void CScribbleView::OnLButtonUp(UINT, CPoint point)
  113. {
  114. // Mouse button up is interesting in the Scribble application
  115. // only if the user is currently drawing a new stroke by dragging
  116. // the captured mouse.
  117. if (GetCapture() != this)
  118. return; // If this window (view) didn't capture the mouse,
  119. // then the user isn't drawing in this window.
  120. CScribbleDoc* pDoc = GetDocument();
  121. CClientDC dc(this);
  122. CPen* pOldPen = dc.SelectObject(pDoc->GetCurrentPen());
  123. dc.MoveTo(m_ptPrev);
  124. dc.LineTo(point);
  125. dc.SelectObject(pOldPen);
  126. m_pStrokeCur->m_pointArray.Add(point);
  127. ReleaseCapture();   // Release the mouse capture established at
  128. // the beginning of the mouse drag.
  129. return;
  130. }
  131. void CScribbleView::OnMouseMove(UINT, CPoint point)
  132. {
  133. // Mouse movement is interesting in the Scribble application
  134. // only if the user is currently drawing a new stroke by dragging
  135. // the captured mouse.
  136. if (GetCapture() != this)
  137. return; // If this window (view) didn't capture the mouse,
  138. // then the user isn't drawing in this window.
  139. CClientDC dc(this);
  140. m_pStrokeCur->m_pointArray.Add(point);
  141. // Draw a line from the previous detected point in the mouse
  142. // drag to the current point.
  143. CPen* pOldPen = dc.SelectObject(GetDocument()->GetCurrentPen());
  144. dc.MoveTo(m_ptPrev);
  145. dc.LineTo(point);
  146. dc.SelectObject(pOldPen);
  147. m_ptPrev = point;
  148. return;
  149. }