Scribvw.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:12k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // ScribVw.cpp : implementation of the CScribbleView class
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Scribble.h"
  22. #include "ScribDoc.h"
  23. #include "ScribVw.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CScribbleView
  31. IMPLEMENT_DYNCREATE(CScribbleView, CScrollView)
  32. BEGIN_MESSAGE_MAP(CScribbleView, CScrollView)
  33. //{{AFX_MSG_MAP(CScribbleView)
  34. ON_WM_LBUTTONDOWN()
  35. ON_WM_LBUTTONUP()
  36. ON_WM_MOUSEMOVE()
  37. ON_COMMAND(ID_CANCEL_EDIT_SRVR, OnCancelEditSrvr)
  38. ON_WM_SIZE()
  39. //}}AFX_MSG_MAP
  40. // Standard printing commands
  41. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  42. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  43. ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
  44. END_MESSAGE_MAP()
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CScribbleView construction/destruction
  47. CScribbleView::CScribbleView()
  48. {
  49. SetScrollSizes(MM_TEXT, CSize(0, 0));
  50. }
  51. CScribbleView::~CScribbleView()
  52. {
  53. }
  54. BOOL CScribbleView::PreCreateWindow(CREATESTRUCT& cs)
  55. {
  56. // TODO: Modify the Window class or styles here by modifying
  57. //  the CREATESTRUCT cs
  58. return CView::PreCreateWindow(cs);
  59. }
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CScribbleView drawing
  62. void CScribbleView::OnDraw(CDC* pDC)
  63. {
  64. CScribbleDoc* pDoc = GetDocument();
  65. ASSERT_VALID(pDoc);
  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. pStroke->DrawStroke(pDC);
  72. }
  73. }
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CScribbleView printing
  76. BOOL CScribbleView::OnPreparePrinting(CPrintInfo* pInfo)
  77. {
  78. pInfo->SetMaxPage(2);   // the document is two pages long:
  79.                         // the first page is the title page
  80.                         // the second is the drawing
  81. BOOL bRet = DoPreparePrinting(pInfo);   // default preparation
  82. pInfo->m_nNumPreviewPages = 2;  // Preview 2 pages at a time
  83. // Set this value after calling DoPreparePrinting to override
  84. // value read from .INI file
  85. return bRet;
  86. }
  87. void CScribbleView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  88. {
  89. // TODO: add extra initialization before printing
  90. }
  91. void CScribbleView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  92. {
  93. // TODO: add cleanup after printing
  94. }
  95. /////////////////////////////////////////////////////////////////////////////
  96. // CScribbleView diagnostics
  97. #ifdef _DEBUG
  98. void CScribbleView::AssertValid() const
  99. {
  100. CScrollView::AssertValid();
  101. }
  102. void CScribbleView::Dump(CDumpContext& dc) const
  103. {
  104. CScrollView::Dump(dc);
  105. }
  106. CScribbleDoc* CScribbleView::GetDocument() // non-debug version is inline
  107. {
  108. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CScribbleDoc)));
  109. return (CScribbleDoc*)m_pDocument;
  110. }
  111. #endif //_DEBUG
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CScribbleView message handlers
  114. void CScribbleView::OnLButtonDown(UINT, CPoint point)
  115. {
  116. // Pressing the mouse button in the view window starts a new stroke
  117. // CScrollView changes the viewport origin and mapping mode.
  118. // It's necessary to convert the point from device coordinates
  119. // to logical coordinates, such as are stored in the document.
  120. CClientDC dc(this);
  121. OnPrepareDC(&dc);
  122. DPtoLP(dc, &point);
  123. m_pStrokeCur = GetDocument()->NewStroke();
  124. // Add first point to the new stroke
  125. m_pStrokeCur->m_pointArray.Add(point);
  126. SetCapture();       // Capture the mouse until button up.
  127. m_ptPrev = point;   // Serves as the MoveTo() anchor point for the
  128.                     // LineTo() the next point, as the user drags the
  129.                     // mouse.
  130. return;
  131. }
  132. void CScribbleView::Line(CDC& dc, CPoint pt1, CPoint pt2)
  133. {
  134. dc.MoveTo(pt1);
  135. dc.LineTo(pt2);
  136. }
  137. void CScribbleView::DPtoLP(CDC& dc, CPoint* lpPoint)
  138. {
  139. if (GetExStyle() & WS_EX_LAYOUTRTL)
  140. {
  141. lpPoint->x = CXTPClientRect(this).Width() - lpPoint->x;
  142. }
  143. dc.DPtoLP(lpPoint);
  144. }
  145. void CScribbleView::OnLButtonUp(UINT, CPoint point)
  146. {
  147. // Mouse button up is interesting in the Scribble application
  148. // only if the user is currently drawing a new stroke by dragging
  149. // the captured mouse.
  150. if (GetCapture() != this)
  151. return; // If this window (view) didn't capture the mouse,
  152.         // then the user isn't drawing in this window.
  153. CScribbleDoc* pDoc = GetDocument();
  154. CClientDC dc(this);
  155. // CScrollView changes the viewport origin and mapping mode.
  156. // It's necessary to convert the point from device coordinates
  157. // to logical coordinates, such as are stored in the document.
  158. OnPrepareDC(&dc);  // set up mapping mode and viewport origin
  159. DPtoLP(dc, &point);
  160. CPen* pOldPen = dc.SelectObject(pDoc->GetCurrentPen());
  161. Line(dc, m_ptPrev, point);
  162. dc.SelectObject(pOldPen);
  163. m_pStrokeCur->m_pointArray.Add(point);
  164. // Tell the stroke item that we're done adding points to it.
  165. // This is so it can finish computing its bounding rectangle.
  166. m_pStrokeCur->FinishStroke();
  167. // Tell the other views that this stroke has been added
  168. // so that they can invalidate this stroke's area in their
  169. // client area.
  170. pDoc->UpdateAllViews(this, 0L, m_pStrokeCur);
  171. ReleaseCapture();   // Release the mouse capture established at
  172.                     // the beginning of the mouse drag.
  173. pDoc->NotifyChanged();
  174. return;
  175. }
  176. void CScribbleView::OnMouseMove(UINT, CPoint point)
  177. {
  178. // Mouse movement is interesting in the Scribble application
  179. // only if the user is currently drawing a new stroke by dragging
  180. // the captured mouse.
  181. if (GetCapture() != this)
  182. return; // If this window (view) didn't capture the mouse,
  183.         // then the user isn't drawing in this window.
  184. CClientDC dc(this);
  185. // CScrollView changes the viewport origin and mapping mode.
  186. // It's necessary to convert the point from device coordinates
  187. // to logical coordinates, such as are stored in the document.
  188. OnPrepareDC(&dc);
  189. DPtoLP(dc, &point);
  190. m_pStrokeCur->m_pointArray.Add(point);
  191. // Draw a line from the previous detected point in the mouse
  192. // drag to the current point.
  193. CPen* pOldPen = dc.SelectObject(GetDocument()->GetCurrentPen());
  194. Line(dc, m_ptPrev, point);
  195. dc.SelectObject(pOldPen);
  196. m_ptPrev = point;
  197. return;
  198. }
  199. void CScribbleView::OnUpdate(CView* /* pSender */, LPARAM /* lHint */,
  200. CObject* pHint)
  201. {
  202. // The document has informed this view that some data has changed.
  203. if (pHint != NULL)
  204. {
  205. if (pHint->IsKindOf(RUNTIME_CLASS(CStroke)))
  206. {
  207. // The hint is that a stroke as been added (or changed).
  208. // So, invalidate its rectangle.
  209. CStroke* pStroke = (CStroke*)pHint;
  210. CClientDC dc(this);
  211. OnPrepareDC(&dc);
  212. CRect rectInvalid = pStroke->GetBoundingRect();
  213. dc.LPtoDP(&rectInvalid);
  214. InvalidateRect(&rectInvalid);
  215. return;
  216. }
  217. }
  218. // We can't interpret the hint, so assume that anything might
  219. // have been updated.
  220. Invalidate(TRUE);
  221. return;
  222. }
  223. void CScribbleView::OnInitialUpdate()
  224. {
  225. ResyncScrollSizes();
  226. CScrollView::OnInitialUpdate();
  227. }
  228. void CScribbleView::ResyncScrollSizes()
  229. {
  230. CClientDC dc(NULL);
  231. OnPrepareDC(&dc);
  232. CSize sizeDoc = GetDocument()->GetDocSize();
  233. dc.LPtoDP(&sizeDoc);
  234. SetScrollSizes(MM_TEXT, sizeDoc);
  235. }
  236. void CScribbleView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
  237. {
  238. if (pInfo->m_nCurPage == 1)  // page no. 1 is the title page
  239. {
  240. PrintTitlePage(pDC, pInfo);
  241. return; // nothing else to print on page 1 but the page title
  242. }
  243. CString strHeader = GetDocument()->GetTitle();
  244. PrintPageHeader(pDC, pInfo, strHeader);
  245. // PrintPageHeader() subtracts out from the pInfo->m_rectDraw the
  246. // amount of the page used for the header.
  247. pDC->SetWindowOrg(pInfo->m_rectDraw.left,-pInfo->m_rectDraw.top);
  248. // Now print the rest of the page
  249. OnDraw(pDC);
  250. }
  251. void CScribbleView::PrintTitlePage(CDC* pDC, CPrintInfo* pInfo)
  252. {
  253. // Prepare a font size for displaying the file name
  254. LOGFONT logFont;
  255. memset(&logFont, 0, sizeof(LOGFONT));
  256. logFont.lfHeight = 75;  //  3/4th inch high in MM_LOENGLISH
  257.                         // (1/100th inch)
  258. CFont font;
  259. CFont* pOldFont = NULL;
  260. if (font.CreateFontIndirect(&logFont))
  261. pOldFont = pDC->SelectObject(&font);
  262. // Get the file name, to be displayed on title page
  263. CString strPageTitle = GetDocument()->GetTitle();
  264. // Display the file name 1 inch below top of the page,
  265. // centered horizontally
  266. pDC->SetTextAlign(TA_CENTER);
  267. pDC->TextOut(pInfo->m_rectDraw.right/2, -100, strPageTitle);
  268. if (pOldFont != NULL)
  269. pDC->SelectObject(pOldFont);
  270. }
  271. void CScribbleView::PrintPageHeader(CDC* pDC, CPrintInfo* pInfo,
  272. CString& strHeader)
  273. {
  274. // Print a page header consisting of the name of
  275. // the document and a horizontal line
  276. pDC->SetTextAlign(TA_LEFT);
  277. pDC->TextOut(0,-25, strHeader);  // 1/4 inch down
  278. // Draw a line across the page, below the header
  279. TEXTMETRIC textMetric;
  280. pDC->GetTextMetrics(&textMetric);
  281. int y = -35 - textMetric.tmHeight;          // line 1/10th inch below text
  282. pDC->MoveTo(0, y);                          // from left margin
  283. pDC->LineTo(pInfo->m_rectDraw.right, y);    // to right margin
  284. // Subtract out from the drawing rectange the space used by the header.
  285. y -= 25;    // space 1/4 inch below (top of) line
  286. pInfo->m_rectDraw.top += y;
  287. }
  288. // The following command handler provides the standard keyboard
  289. //  user interface to cancel an in-place editing session.  Here,
  290. //  the server (not the container) causes the deactivation.
  291. void CScribbleView::OnCancelEditSrvr()
  292. {
  293. GetDocument()->OnDeactivateUI(FALSE);
  294. }
  295. void CScribbleView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
  296. {
  297. CScribbleDoc* pDoc = GetDocument();
  298. CScrollView::OnPrepareDC(pDC, pInfo);
  299. pDC->SetMapMode(MM_ANISOTROPIC);
  300. CSize sizeDoc = pDoc->GetDocSize();
  301. sizeDoc.cy = -sizeDoc.cy;
  302. pDC->SetWindowExt(sizeDoc);
  303. CSize sizeNum, sizeDenom;
  304. pDoc->GetZoomFactor(&sizeNum, &sizeDenom);
  305. int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
  306. int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
  307. long xExt = (long)sizeDoc.cx * xLogPixPerInch * sizeNum.cx;
  308. xExt /= 100 * (long)sizeDenom.cx;
  309. long yExt = (long)sizeDoc.cy * yLogPixPerInch * sizeNum.cy;
  310. yExt /= 100 * (long)sizeDenom.cy;
  311. pDC->SetViewportExt((int)xExt, (int)-yExt);
  312. }
  313. void CScribbleView::OnSize(UINT nType, int cx, int cy)
  314. {
  315. ResyncScrollSizes();        // ensure that scroll info is up-to-date
  316. CScrollView::OnSize(nType, cx, cy);
  317. }
  318. void CScribbleView::OnFilePrintPreview() 
  319. {
  320. // replace the default print preview with ours!
  321. // In derived classes, implement special window handling here
  322. // Be sure to Unhook Frame Window close if hooked.
  323. // must not create this on the frame.  Must outlive this function
  324. CPrintPreviewState* pState = new CPrintPreviewState;
  325. // DoPrintPreview's return value does not necessarily indicate that
  326. // Print preview succeeded or failed, but rather what actions are necessary
  327. // at this point.  If DoPrintPreview returns TRUE, it means that
  328. // OnEndPrintPreview will be (or has already been) called and the
  329. // pState structure will be/has been deleted.
  330. // If DoPrintPreview returns FALSE, it means that OnEndPrintPreview
  331. // WILL NOT be called and that cleanup, including deleting pState
  332. // must be done here.
  333. if (!DoPrintPreview(XTP_IDD_PREVIEW_DIALOGBAR, this, RUNTIME_CLASS(CXTPPreviewView), pState))
  334. {
  335. // In derived classes, reverse special window handling here for
  336. // Preview failure case
  337. TRACE0("Error: DoPrintPreview failed.n");
  338. AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
  339. delete pState;      // preview failed to initialize, delete State now
  340. pState = NULL;
  341. }
  342. }