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

对话框与窗口

开发平台:

Visual C++

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