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

Windows编程

开发平台:

Visual C++

  1. // svrdoc.cpp : implementation of the CServerDoc 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 "hiersvr.h"
  14. #include "svrdoc.h"
  15. #include "svritem.h"
  16. #include "svrview.h"
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char BASED_CODE THIS_FILE[] = __FILE__;
  20. #endif
  21. CLIPFORMAT NEAR CServerDoc::m_cfPrivate = NULL;
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CServerDoc
  24. IMPLEMENT_DYNCREATE(CServerDoc, COleServerDoc)
  25. BEGIN_MESSAGE_MAP(CServerDoc, COleServerDoc)
  26. //{{AFX_MSG_MAP(CServerDoc)
  27. ON_COMMAND(ID_OPTIONS_FONT, OnOptionsFont)
  28. ON_COMMAND(ID_CANCEL_INPLACE, OnCancelInplace)
  29. //}}AFX_MSG_MAP
  30. END_MESSAGE_MAP()
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CServerDoc construction/destruction
  33. CServerDoc::CServerDoc()
  34. {
  35. m_pRoot = CServerNode::CreateRootNode(this);
  36. // determine default font for document
  37. memset(&m_logfont, 0, sizeof m_logfont);
  38. m_logfont.lfHeight = -10;
  39. lstrcpy(m_logfont.lfFaceName, _T("Arial"));
  40. m_logfont.lfOutPrecision = OUT_TT_PRECIS;
  41. m_logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  42. m_logfont.lfQuality = PROOF_QUALITY;
  43. m_logfont.lfPitchAndFamily = FF_SWISS | VARIABLE_PITCH;
  44. // use default window text color
  45. m_crText = COLOR_WINDOWTEXT+1;
  46. if (m_cfPrivate == NULL)
  47. {
  48. m_cfPrivate = (CLIPFORMAT)
  49. ::RegisterClipboardFormat(_T("MFC HierSvr Sample"));
  50. }
  51. }
  52. CServerDoc::~CServerDoc()
  53. {
  54. delete m_pRoot;     // delete kills child nodes
  55. }
  56. void CServerDoc::DeleteContents()
  57. {
  58. COleServerDoc::DeleteContents();
  59. if (m_pRoot != NULL)
  60. m_pRoot->InitRootNode();
  61. }
  62. BOOL CServerDoc::OnNewDocument()
  63. {
  64. if (!COleServerDoc::OnNewDocument())
  65. return FALSE;
  66. // Note: m_pRoot is created in the constructor
  67. return (m_pRoot != NULL);
  68. }
  69. COleServerItem* CServerDoc::OnGetEmbeddedItem()
  70. {
  71. ASSERT_VALID(m_pRoot);
  72. // allocate embedded item first time requested
  73. if (m_pRoot->m_pServerItem == NULL)
  74. m_pRoot->m_pServerItem = new CServerItem(this, m_pRoot);
  75. // and return it
  76. ASSERT_VALID(m_pRoot->m_pServerItem);
  77. return m_pRoot->m_pServerItem;
  78. }
  79. COleServerItem* CServerDoc::OnGetLinkedItem(LPCTSTR lpszItemName)
  80. {
  81. ASSERT_VALID(m_pRoot);
  82. // look in current list first
  83. COleServerItem* pItem = COleServerDoc::OnGetLinkedItem(lpszItemName);
  84. if (pItem != NULL)
  85. return pItem;
  86. // look in document itself for an item with that link name
  87. CString strItemName = lpszItemName;
  88. CServerNode* pNode = m_pRoot->FindNode(strItemName);
  89. if (pNode == NULL)
  90. return NULL;    // node does not exist
  91. ASSERT(pNode->m_pServerItem == NULL);   // should not be connected
  92. pItem = new CServerItem(this, pNode);
  93. ASSERT_VALID(pItem);
  94. // return new item that matches lpszItemName
  95. return pItem;
  96. }
  97. CFont* CServerDoc::SelectDocFont(CDC* pDC, CFont& font)
  98. {
  99. // convert points in m_logfont.lfHeight to logical
  100. LOGFONT logfont = m_logfont;
  101. logfont.lfHeight = -::MulDiv(-logfont.lfHeight,
  102. pDC->GetDeviceCaps(LOGPIXELSY), 72);
  103. // set the text color as appropriate
  104. COLORREF cr = m_crText;
  105. if (cr == COLOR_WINDOW+1)
  106. cr = GetSysColor(COLOR_WINDOW);
  107. pDC->SetTextColor(m_crText);
  108. // create the font object
  109. if (!font.CreateFontIndirect(&logfont))
  110. return NULL;
  111. // select the font
  112. return pDC->SelectObject(&font);
  113. }
  114. int CServerDoc::DrawTree(CDC* pDC, CPoint ptStart, CServerNode* pNodeSel,
  115. CServerNode* pRoot)
  116. {
  117. if (pRoot == NULL)
  118. pRoot = m_pRoot;
  119. // select correct font for the document
  120. CFont font;
  121. CFont* pOldFont = SelectDocFont(pDC, font);
  122. if (pOldFont == NULL)
  123. return -1;
  124. // draw the hierachy list
  125. int iResult = pRoot->DrawTree(pDC, ptStart, pNodeSel);
  126. // restore state of the dc
  127. pDC->SelectObject(pOldFont);
  128. return iResult;
  129. }
  130. void CServerDoc::CalcBounding(CDC* pDC, CServerNode* pNodeStart,
  131. CPoint ptStart, CSize& sizeMax)
  132. {
  133. ASSERT_VALID(pNodeStart);
  134. // select correct font for the document
  135. CFont font;
  136. CFont* pOldFont = SelectDocFont(pDC, font);
  137. // calculate the bounding rect
  138. pNodeStart->CalcBounding(pDC, ptStart, sizeMax);
  139. // restore state of the dc
  140. if (pOldFont != NULL)
  141. pDC->SelectObject(pOldFont);
  142. }
  143. /////////////////////////////////////////////////////////////////////////////
  144. // CServerDoc serialization
  145. // this serializes the OLE Server document as a stand-alone file
  146. void CServerDoc::Serialize(CArchive& ar)
  147. {
  148. ASSERT(m_pRoot != NULL);
  149. SerializeFontInfo(ar);
  150. m_pRoot->Serialize(ar);
  151. }
  152. void CServerDoc::SerializeFontInfo(CArchive& ar)
  153. {
  154. if (ar.IsStoring())
  155. {
  156. ar.Write(&m_logfont, sizeof(m_logfont) - sizeof(m_logfont.lfFaceName));
  157. // lfFaceName is stored as CString so it is UNICODE/ANSI independent
  158. ar << CString(m_logfont.lfFaceName);
  159. ar << m_crText;
  160. }
  161. else
  162. {
  163. ar.Read(&m_logfont, sizeof(m_logfont) - sizeof(m_logfont.lfFaceName));
  164. // lfFaceName must be read as a CString
  165. CString strFaceName;
  166. ar >> strFaceName;
  167. lstrcpy(m_logfont.lfFaceName, strFaceName);
  168. ar >> m_crText;
  169. }
  170. }
  171. /////////////////////////////////////////////////////////////////////////////
  172. // CServerDoc in-place editing
  173. void CServerDoc::OnSetItemRects(LPCRECT lpPosRect, LPCRECT lpClipRect)
  174. {
  175. // get first view of document
  176. POSITION pos = GetFirstViewPosition();
  177. ASSERT(pos != NULL);
  178. CServerView* pView = (CServerView*)GetNextView(pos);
  179. ASSERT_KINDOF(CServerView, pView);
  180. ASSERT_VALID(pView);
  181. CSize sizeNum(lpPosRect->right - lpPosRect->left,
  182. lpPosRect->bottom - lpPosRect->top);
  183. // for denom -- get extent in device
  184. // create a view dc
  185. CServerDC dc(pView);
  186. // set zoom to 100%
  187. dc.SetViewportExt(CSize(1,1));
  188. dc.SetWindowExt(CSize(1,1));
  189. // get extents in device
  190. CSize sizeDenom = pView->CalcActualItemSize(m_pRoot, &dc);
  191. // notify first view of potential zoom factor change!
  192. pView->SetZoomFactor(sizeNum, sizeDenom);
  193. // resize the window
  194. COleServerDoc::OnSetItemRects(lpPosRect, lpClipRect);
  195. // set scrollbar state (if necessary)
  196. pView->SetScrollInfo();
  197. }
  198. void CServerDoc::OnOptionsFont()
  199. {
  200. CClientDC dc(NULL);
  201. LOGFONT lf = m_logfont;
  202. lf.lfHeight = -::MulDiv(-lf.lfHeight, dc.GetDeviceCaps(LOGPIXELSY), 72);
  203. CFontDialog dlg(&lf);
  204. dlg.m_cf.rgbColors = m_crText;
  205. if (dlg.DoModal() == IDOK)
  206. {
  207. lf.lfHeight = -::MulDiv(-lf.lfHeight, 72, dc.GetDeviceCaps(LOGPIXELSY));
  208. m_crText = dlg.GetColor();
  209. m_logfont = lf;
  210. SetModifiedFlag();
  211. UpdateAllItems(NULL);
  212. UpdateAllViews(NULL);
  213. }
  214. }
  215. // Note: both the server and the container should have a keyboard method
  216. //  of deactivating an active in-place item.
  217. void CServerDoc::OnCancelInplace()
  218. {
  219. if (IsInPlaceActive())
  220. OnDeactivateUI(FALSE);
  221. }
  222. /////////////////////////////////////////////////////////////////////////////
  223. // CServerDoc diagnostics
  224. #ifdef _DEBUG
  225. void CServerDoc::AssertValid() const
  226. {
  227. COleServerDoc::AssertValid();
  228. }
  229. void CServerDoc::Dump(CDumpContext& dc) const
  230. {
  231. COleServerDoc::Dump(dc);
  232. }
  233. #endif //_DEBUG
  234. /////////////////////////////////////////////////////////////////////////////