SRVRITEM.CPP
上传用户:aakk678
上传日期:2022-07-09
资源大小:406k
文件大小:4k
源码类别:

界面编程

开发平台:

Visual C++

  1. // srvritem.cpp : implementation of the CWordPadSrvrItem class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1997 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 "wordpad.h"
  14. #include "wordpdoc.h"
  15. #include "wordpvw.h"
  16. #include "srvritem.h"
  17. #include <limits.h>
  18. IMPLEMENT_DYNAMIC(CEmbeddedItem, COleServerItem)
  19. extern CLIPFORMAT cfRTF;
  20. CEmbeddedItem::CEmbeddedItem(CWordPadDoc* pContainerDoc, int nBeg, int nEnd)
  21. : COleServerItem(pContainerDoc, TRUE)
  22. {
  23. ASSERT(pContainerDoc != NULL);
  24. ASSERT_VALID(pContainerDoc);
  25. m_nBeg = nBeg;
  26. m_nEnd = nEnd;
  27. }
  28. CWordPadView* CEmbeddedItem::GetView() const
  29. {
  30. CDocument* pDoc = GetDocument();
  31. ASSERT_VALID(pDoc);
  32. POSITION pos = pDoc->GetFirstViewPosition();
  33. if (pos == NULL)
  34. return NULL;
  35. CWordPadView* pView = (CWordPadView*)pDoc->GetNextView(pos);
  36. ASSERT_VALID(pView);
  37. ASSERT(pView->IsKindOf(RUNTIME_CLASS(CWordPadView)));
  38. return pView;
  39. }
  40. void CEmbeddedItem::Serialize(CArchive& ar)
  41. {
  42. if (m_lpRichDataObj != NULL)
  43. {
  44. ASSERT(ar.IsStoring());
  45. FORMATETC etc = {NULL, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
  46. etc.cfFormat = (CLIPFORMAT)cfRTF;
  47. STGMEDIUM stg;
  48. if (SUCCEEDED(m_lpRichDataObj->GetData(&etc, &stg)))
  49. {
  50. LPBYTE p = (LPBYTE)GlobalLock(stg.hGlobal);
  51. if (p != NULL)
  52. {
  53. ar.Write(p, GlobalSize(stg.hGlobal));
  54. GlobalUnlock(stg.hGlobal);
  55. }
  56. ASSERT(stg.tymed == TYMED_HGLOBAL);
  57. ReleaseStgMedium(&stg);
  58. }
  59. }
  60. else
  61. GetDocument()->Serialize(ar);
  62. }
  63. BOOL CEmbeddedItem::OnGetExtent(DVASPECT dwDrawAspect, CSize& rSize)
  64. {
  65. if (dwDrawAspect != DVASPECT_CONTENT)
  66. return COleServerItem::OnGetExtent(dwDrawAspect, rSize);
  67. CClientDC dc(NULL);
  68. return OnDrawEx(&dc, rSize, FALSE);
  69. }
  70. BOOL CEmbeddedItem::OnDraw(CDC* pDC, CSize& rSize)
  71. {
  72. return OnDrawEx(pDC, rSize, TRUE);
  73. }
  74. BOOL CEmbeddedItem::OnDrawEx(CDC* pDC, CSize& rSize, BOOL bOutput)
  75. {
  76. CDisplayIC dc;
  77. CWordPadView* pView = GetView();
  78. if (pView == NULL)
  79. return FALSE;
  80. ASSERT_VALID(pView);
  81. int nWrap = pView->m_nWordWrap;
  82. CRect rect;//rect in twips
  83. rect.left = rect.top = 0;
  84. rect.bottom = 32767; // bottomless
  85. rect.right = 32767;
  86. if (nWrap == 0) // no word wrap
  87. rect.right = 32767;
  88. else if (nWrap == 1) // wrap to window
  89. {
  90. CRect rectClient;
  91. pView->GetClientRect(&rectClient);
  92. rect.right = rectClient.right - HORZ_TEXTOFFSET;
  93. rect.right = MulDiv(rect.right, 1440, dc.GetDeviceCaps(LOGPIXELSX));
  94. }
  95. else if (nWrap == 2) // wrap to ruler
  96. rect.right = pView->GetPrintWidth();
  97.                  
  98. // first just determine the correct extents of the text
  99. pDC->SetBkMode(TRANSPARENT);
  100. if (pView->PrintInsideRect(pDC, rect, m_nBeg, m_nEnd, FALSE) == 0)
  101. {
  102. // default to 12pts high and 4" wide if no text
  103. rect.bottom = rect.top+12*20+1; // 12 pts high
  104. rect.right = rect.left+ 4*1440;
  105. }
  106. rect.bottom+=3*(1440/dc.GetDeviceCaps(LOGPIXELSX)); // three pixels
  107. // then, really output the text
  108. CRect rectOut = rect; // don't pass rect because it will get clobbered
  109. if (bOutput)
  110. pView->PrintInsideRect(pDC, rectOut, m_nBeg, m_nEnd, TRUE);
  111. ASSERT(rectOut.right == rect.right);
  112. // adjust for border (rect.left is already adjusted)
  113. if (pView->GetStyle() & WS_HSCROLL)
  114. ++rect.bottom;  // account for border on scroll bar!
  115. // return HIMETRIC size
  116. rSize = rect.Size();
  117. rSize.cx = MulDiv(rSize.cx, 2540, 1440); // convert twips to HIMETRIC
  118. rSize.cy = MulDiv(rSize.cy, 2540, 1440); // convert twips to HIMETRIC
  119. return TRUE;
  120. }
  121. /////////////////////////////////////////////////////////////////////////////