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

Windows编程

开发平台:

Visual C++

  1. //**********************************************************************
  2. // File name: DOC.CPP
  3. //
  4. //      Implementation file for CSimpleDoc.
  5. //
  6. // Functions:
  7. //
  8. //      See DOC.H for Class Definition
  9. //
  10. // Copyright (c) 1992 - 1997 Microsoft Corporation. All rights reserved.
  11. //**********************************************************************
  12. #include "pre.h"
  13. #include "iocs.h"
  14. #include "ias.h"
  15. #include "ioipf.h"
  16. #include "ioips.h"
  17. #include "app.h"
  18. #include "site.h"
  19. #include "doc.h"
  20. //**********************************************************************
  21. //
  22. // CSimpleDoc::Create
  23. //
  24. // Purpose:
  25. //
  26. //      Creation for the CSimpleDoc Class
  27. //
  28. // Parameters:
  29. //
  30. //      CSimpleApp FAR * lpApp  -   Pointer to the CSimpleApp Class
  31. //
  32. //      LPRECT lpRect           -   Client area rect of "frame" window
  33. //
  34. //      HWND hWnd               -   Window Handle of "frame" window
  35. //
  36. // Return Value:
  37. //
  38. //      None
  39. //
  40. // Function Calls:
  41. //      Function                    Location
  42. //
  43. //      StgCreateDocfile            OLE API
  44. //      CreateWindow                Windows API
  45. //      ShowWindow                  Windows API
  46. //      UpdateWindow                Windows API
  47. //
  48. // Comments:
  49. //
  50. //      This routine was added so that failure could be returned
  51. //      from object creation.
  52. //
  53. //********************************************************************
  54. CSimpleDoc FAR * CSimpleDoc::Create(CSimpleApp FAR *lpApp, LPRECT lpRect,HWND hWnd)
  55. {
  56.         CSimpleDoc FAR * lpTemp = new CSimpleDoc(lpApp, hWnd);
  57.         if (!lpTemp)
  58.                 return NULL;
  59.         // create storage for the doc.
  60.         HRESULT hErr = StgCreateDocfile (NULL, STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE,
  61.                                                                          0, &lpTemp->m_lpStorage);
  62.         if (hErr != NOERROR)
  63.                 goto error;
  64.         // create the document Window
  65.         lpTemp->m_hDocWnd = CreateWindow(
  66.                         "SimpCntrDocWClass",
  67.                         NULL,
  68.                         WS_CHILD | WS_CLIPCHILDREN,
  69.                         lpRect->left,
  70.                         lpRect->top,
  71.                         lpRect->right,
  72.                         lpRect->bottom,
  73.                         hWnd,
  74.                         NULL,
  75.                         lpApp->m_hInst,
  76.                         NULL);
  77.         if (!lpTemp->m_hDocWnd)
  78.                 goto error;
  79.         ShowWindow(lpTemp->m_hDocWnd, SW_SHOWNORMAL);  // Show the window
  80.         UpdateWindow(lpTemp->m_hDocWnd);               // Sends WM_PAINT message
  81.         // Ensable InsertObject menu choice
  82.         EnableMenuItem( lpApp->m_hEditMenu, 0, MF_BYPOSITION | MF_ENABLED);
  83.         // we will add one ref count on our document. later in CSimpleDoc::Close
  84.         // we will release this  ref count. when the document's ref count goes
  85.         // to 0, the document will be deleted.
  86.         lpTemp->AddRef();
  87.         return (lpTemp);
  88. error:
  89.         delete (lpTemp);
  90.         return NULL;
  91. }
  92. //**********************************************************************
  93. //
  94. // CSimpleDoc::Close
  95. //
  96. // Purpose:
  97. //
  98. //      Close CSimpleDoc object.
  99. //      when the document's reference count goes to 0, the document
  100. //      will be destroyed.
  101. //
  102. // Parameters:
  103. //
  104. //
  105. // Return Value:
  106. //
  107. //      None
  108. //
  109. // Function Calls:
  110. //      Function                    Location
  111. //
  112. //      RevokeDragDrop              OLE API
  113. //      CoLockObjectExternal        OLE API
  114. //      OleFlushClipboard           OLE API
  115. //      ShowWindow                  Windows API
  116. //
  117. // Comments:
  118. //
  119. //********************************************************************
  120. void CSimpleDoc::Close(void)
  121. {
  122.         OutputDebugString("In CSimpleDoc::Closern");
  123.         ShowWindow(m_hDocWnd, SW_HIDE);  // Hide the window
  124.         // Close the OLE object in our document
  125.         if (m_lpSite)
  126.                 m_lpSite->CloseOleObject();
  127.         // Release the ref count added in CSimpleDoc::Create. this will make
  128.         // the document's ref count go to 0, and the document will be deleted.
  129.         Release();
  130. }
  131. //**********************************************************************
  132. //
  133. // CSimpleDoc::CSimpleDoc
  134. //
  135. // Purpose:
  136. //
  137. //      Constructor for the CSimpleDoc Class
  138. //
  139. // Parameters:
  140. //
  141. //      CSimpleApp FAR * lpApp  -   Pointer to the CSimpleApp Class
  142. //
  143. //      HWND hWnd               -   Window Handle of "frame" window
  144. //
  145. // Return Value:
  146. //
  147. //      None
  148. //
  149. // Function Calls:
  150. //      Function                    Location
  151. //
  152. //      OutputDebugString           Windows API
  153. //      GetMenu                     Windows API
  154. //      GetSubMenu                  Windows API
  155. //
  156. // Comments:
  157. //
  158. //********************************************************************
  159. CSimpleDoc::CSimpleDoc(CSimpleApp FAR * lpApp,HWND hWnd)
  160. {
  161.         OutputDebugString("In CSimpleDoc's Constructorrn");
  162.         m_lpApp = lpApp;
  163.         m_lpSite = NULL;
  164.         // set up menu handles
  165.         m_lpApp->m_hMainMenu = GetMenu(hWnd);
  166.         m_lpApp->m_hFileMenu = GetSubMenu(m_lpApp->m_hMainMenu, 0);
  167.         m_lpApp->m_hEditMenu = GetSubMenu(m_lpApp->m_hMainMenu, 1);
  168.         m_lpApp->m_hHelpMenu = GetSubMenu(m_lpApp->m_hMainMenu, 2);
  169.         m_lpApp->m_hCascadeMenu = NULL;
  170.         m_lpActiveObject = NULL;
  171.         // flags
  172.         m_fInPlaceActive = FALSE;
  173.         m_fAddMyUI = FALSE;
  174.         m_fModifiedMenu = FALSE;
  175. }
  176. //**********************************************************************
  177. //
  178. // CSimpleDoc::~CSimpleDoc
  179. //
  180. // Purpose:
  181. //
  182. //      Destructor for CSimpleDoc
  183. //
  184. // Parameters:
  185. //
  186. //      None
  187. //
  188. // Return Value:
  189. //
  190. //      None
  191. //
  192. // Function Calls:
  193. //      Function                    Location
  194. //
  195. //      OutputDebugString           Windows API
  196. //      CSimpleSite::Release        SITE.CPP
  197. //      IStorage::Release           OLE API
  198. //
  199. // Comments:
  200. //
  201. //********************************************************************
  202. CSimpleDoc::~CSimpleDoc()
  203. {
  204.         OutputDebugString("In CSimpleDoc's Destructorrn");
  205.         // Release all pointers we hold to the OLE object. also release
  206.         // the ref count added in CSimpleSite::Create. this will make
  207.         // the Site's ref count go to 0, and the Site will be deleted.
  208.         if (m_lpSite) {
  209.                 m_lpSite->UnloadOleObject();
  210.                 m_lpSite->Release();
  211.                 m_lpSite = NULL;
  212.         }
  213.         // Release the Storage
  214.         if (m_lpStorage) {
  215.                 m_lpStorage->Release();
  216.                 m_lpStorage = NULL;
  217.         }
  218.         // if the edit menu was modified, remove the menu item and
  219.         // destroy the popup if it exists
  220.         if (m_fModifiedMenu)
  221.                 {
  222.                 int nCount = GetMenuItemCount(m_lpApp->m_hEditMenu);
  223.                 RemoveMenu(m_lpApp->m_hEditMenu, nCount-1, MF_BYPOSITION);
  224.                 if (m_lpApp->m_hCascadeMenu)
  225.                         DestroyMenu(m_lpApp->m_hCascadeMenu);
  226.                 }
  227.         DestroyWindow(m_hDocWnd);
  228. }
  229. //**********************************************************************
  230. //
  231. // CSimpleDoc::QueryInterface
  232. //
  233. // Purpose:
  234. //
  235. //      Return a pointer to a requested interface
  236. //
  237. // Parameters:
  238. //
  239. //      REFIID riid         -   ID of interface to be returned
  240. //      LPVOID FAR* ppvObj  -   Location to return the interface
  241. //
  242. // Return Value:
  243. //
  244. //      S_FALSE -   Always
  245. //
  246. // Function Calls:
  247. //      Function                    Location
  248. //
  249. //      OutputDebugString           Windows API
  250. //                   OLE API
  251. //
  252. // Comments:
  253. //
  254. //      In this implementation, there are no doc level interfaces.
  255. //      In an MDI application, there would be an IOleInPlaceUIWindow
  256. //      associated with the document to provide document level tool
  257.  //     space negotiation.
  258. //
  259. //********************************************************************
  260. STDMETHODIMP CSimpleDoc::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
  261. {
  262.         OutputDebugString("In CSimpleDoc::QueryInterfacern");
  263.         *ppvObj = NULL;     // must set out pointer parameters to NULL
  264.         // Not a supported interface
  265.         return E_NOINTERFACE;
  266. }
  267. //**********************************************************************
  268. //
  269. // CSimpleDoc::AddRef
  270. //
  271. // Purpose:
  272. //
  273. //      Increments the document reference count
  274. //
  275. // Parameters:
  276. //
  277. //      None
  278. //
  279. // Return Value:
  280. //
  281. //      UINT    -   The current reference count on the document
  282. //
  283. // Function Calls:
  284. //      Function                    Location
  285. //
  286. //      OutputDebugString           Windows API
  287. //      CSimpleApp::AddRef          APP.CPP
  288. //
  289. // Comments:
  290. //
  291. //********************************************************************
  292. STDMETHODIMP_(ULONG) CSimpleDoc::AddRef()
  293. {
  294.         OutputDebugString("In CSimpleDoc::AddRefrn");
  295.         return SafeAddRef();
  296. }
  297. //**********************************************************************
  298. //
  299. // CSimpleDoc::Release
  300. //
  301. // Purpose:
  302. //
  303. //      Decrements the document reference count
  304. //
  305. // Parameters:
  306. //
  307. //      None
  308. //
  309. // Return Value:
  310. //
  311. //      UINT    -   The current reference count on the document
  312. //
  313. // Function Calls:
  314. //      Function                    Location
  315. //
  316. //      OutputDebugString           Windows API
  317. //
  318. // Comments:
  319. //
  320. //********************************************************************
  321. STDMETHODIMP_(ULONG) CSimpleDoc::Release()
  322. {
  323.         OutputDebugString("In CSimpleDoc::Releasern");
  324.         return SafeRelease();
  325. }
  326. //**********************************************************************
  327. //
  328. // CSimpleDoc::InsertObject
  329. //
  330. // Purpose:
  331. //
  332. //      Inserts a new object to this document
  333. //
  334. // Parameters:
  335. //
  336. //      None
  337. //
  338. // Return Value:
  339. //
  340. //      None
  341. //
  342. // Function Calls:
  343. //      Function                    Location
  344. //
  345. //      CSimpleSite::CSimpleSite    SITE.CPP
  346. //      CSimpleSite::InitObject     SITE.CPP
  347. //      memset                      C Runtime
  348. //      OleUIInsertObject           OUTLUI function
  349. //      CSimpleDoc::DisableInsertObject DOC.CPP
  350. //
  351. // Comments:
  352. //
  353. //      This implementation only allows one object to be inserted
  354. //      into a document.  Once the object has been inserted, then
  355. //      the Insert Object menu choice is greyed out, to prevent
  356. //      the user from inserting another.
  357. //
  358. //********************************************************************
  359. void CSimpleDoc::InsertObject()
  360. {
  361.         CStabilize stabilize(this);
  362.         OLEUIINSERTOBJECT io;
  363.         UINT iret;
  364.   //@@WTK WIN32, UNICODE
  365.         //char szFile[MAX_PATH];
  366.         TCHAR szFile[MAX_PATH];
  367.         m_lpSite = CSimpleSite::Create(this);
  368.         // clear the structure
  369.         memset(&io, 0, sizeof(OLEUIINSERTOBJECT));
  370.         // fill the structure
  371.         io.cbStruct = sizeof(OLEUIINSERTOBJECT);
  372.         io.dwFlags = IOF_SELECTCREATENEW |
  373.                                         IOF_DISABLELINK | IOF_DISABLEDISPLAYASICON |
  374.                                         IOF_CREATENEWOBJECT | IOF_CREATEFILEOBJECT;
  375.         io.hWndOwner = m_hDocWnd;
  376.   //@@WTK WIN32, UNICODE
  377.         //io.lpszCaption = (LPSTR)"Insert Object";
  378.         io.lpszCaption = _T("Insert Object");
  379.         io.iid = IID_IOleObject;
  380.         io.oleRender = OLERENDER_DRAW;
  381.         io.lpIOleClientSite = &m_lpSite->m_OleClientSite;
  382.         io.lpIStorage = m_lpSite->m_lpObjStorage;
  383.         io.ppvObj = (LPVOID FAR *)&m_lpSite->m_lpOleObject;
  384.         io.lpszFile = szFile;
  385.   //@@WTK WIN32, UNICODE
  386.         //io.cchFile = sizeof(szFile);
  387.         io.cchFile = sizeof(szFile) / sizeof *szFile;
  388.   //@@WTK WIN32, UNICODE
  389.         //_fmemset((LPSTR)szFile, 0, sizeof(szFile));
  390.         memset(szFile, 0, sizeof(szFile));
  391.         // call OUTLUI to do all the hard work
  392.         iret = OleUIInsertObject(&io);
  393.         if (iret == OLEUI_OK)
  394.                 {
  395.                 m_lpSite->InitObject((BOOL)(io.dwFlags & IOF_SELECTCREATENEW));
  396.                 // disable Insert Object menu item
  397.                 DisableInsertObject();
  398.                 }
  399.         else
  400.                 {
  401.                 m_lpSite->Release();
  402.                 m_lpSite = NULL;
  403.                 m_lpStorage->Revert();
  404.                 }
  405. }
  406. //**********************************************************************
  407. //
  408. // CSimpleDoc::lResizeDoc
  409. //
  410. // Purpose:
  411. //
  412. //      Resizes the document
  413. //
  414. // Parameters:
  415. //
  416. //      LPRECT lpRect   -   The size of the client are of the "frame"
  417. //                          Window.
  418. //
  419. // Return Value:
  420. //
  421. //      NULL
  422. //
  423. // Function Calls:
  424. //      Function                                Location
  425. //
  426. //      IOleInPlaceActiveObject::ResizeBorder   Object
  427. //      MoveWindow                              Windows API
  428. //
  429. // Comments:
  430. //
  431. //********************************************************************
  432. long CSimpleDoc::lResizeDoc(LPRECT lpRect)
  433. {
  434.         CStabilize stabilize(this);
  435.         // if we are InPlace, then call ResizeBorder on the object, otherwise
  436.         // just move the document window.
  437.         if (m_fInPlaceActive)
  438.                 m_lpActiveObject->ResizeBorder(lpRect, &m_lpApp->m_OleInPlaceFrame, TRUE);
  439.         else
  440.                 MoveWindow(m_hDocWnd, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, TRUE);
  441.         return NULL;
  442. }
  443. //**********************************************************************
  444. //
  445. // CSimpleDoc::lAddVerbs
  446. //
  447. // Purpose:
  448. //
  449. //      Adds the objects verbs to the edit menu.
  450. //
  451. // Parameters:
  452. //
  453. //      None
  454. //
  455. // Return Value:
  456. //
  457. //      NULL
  458. //
  459. // Function Calls:
  460. //      Function                    Location
  461. //
  462. //      GetMenuItemCount            Windows API
  463. //      OleUIAddVerbMenu            OUTLUI function
  464. //
  465. // Comments:
  466. //
  467. //********************************************************************
  468. long CSimpleDoc::lAddVerbs(void)
  469. {
  470.         CStabilize stabilize(this);
  471.         // m_fModifiedMenu is TRUE if the menu has already been modified
  472.         // once.  Since we only support one obect every time the application
  473.         // is run, then once the menu is modified, it doesn't have
  474.         // to be done again.
  475.         if (m_lpSite && !m_fInPlaceActive  && !m_fModifiedMenu)
  476.                 {
  477.                 int nCount = GetMenuItemCount(m_lpApp->m_hEditMenu);
  478.                 OleUIAddVerbMenu ( m_lpSite->m_lpOleObject,
  479.                                                    NULL,
  480.                                                    m_lpApp->m_hEditMenu,
  481.                                                    nCount + 1,
  482.                                                    IDM_VERB0,
  483.                                                    0,           // no maximum verb IDM enforced
  484.                                                    FALSE,
  485.                                                    0,
  486.                                                    &m_lpApp->m_hCascadeMenu);
  487.                 m_fModifiedMenu = TRUE;
  488.                 }
  489.         return (NULL);
  490. }
  491. //**********************************************************************
  492. //
  493. // CSimpleDoc::PaintDoc
  494. //
  495. // Purpose:
  496. //
  497. //      Paints the Document
  498. //
  499. // Parameters:
  500. //
  501. //      HDC hDC -   hDC of the document Window
  502. //
  503. // Return Value:
  504. //
  505. //      None
  506. //
  507. // Function Calls:
  508. //      Function                    Location
  509. //
  510. //      CSimpleSite::PaintObj       SITE.CPP
  511. //
  512. // Comments:
  513. //
  514. //********************************************************************
  515. void CSimpleDoc::PaintDoc (HDC hDC)
  516. {
  517.         CStabilize stabilize(this);
  518.         // if we supported multiple objects, then we would enumerate
  519.         // the objects and call paint on each of them from here.
  520.         if (m_lpSite)
  521.                 m_lpSite->PaintObj(hDC);
  522. }
  523. //**********************************************************************
  524. //
  525. // CSimpleDoc::DisableInsertObject
  526. //
  527. // Purpose:
  528. //
  529. //      Disable the ability to insert a new object in this document.
  530. //
  531. // Parameters:
  532. //
  533. //      None
  534. //
  535. // Return Value:
  536. //
  537. //      None
  538. //
  539. // Function Calls:
  540. //      Function                    Location
  541. //
  542. //      EnableMenuItem              Windows API
  543. //
  544. // Comments:
  545. //
  546. //      This implementation only allows one object to be inserted
  547. //      into a document.  Once the object has been inserted, then
  548. //      the Insert Object menu choice is greyed out, to prevent
  549. //      the user from inserting another.
  550. //
  551. //********************************************************************
  552. void CSimpleDoc::DisableInsertObject(void)
  553. {
  554.         // Disable InsertObject menu choice
  555.         EnableMenuItem( m_lpApp->m_hEditMenu, 0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
  556. }