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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * IIPSITE.CPP
  3.  * Patron Chapter 24
  4.  *
  5.  * IOleInPlaceSite interface implementation for Patron
  6.  *
  7.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  8.  *
  9.  * Kraig Brockschmidt, Microsoft
  10.  * Internet  :  kraigb@microsoft.com
  11.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  12.  */
  13. #include "patron.h"
  14. BOOL        g_fSwitchingActive=FALSE;
  15. /*
  16.  * CImpIOleInPlaceSite::CImpIOleInPlaceSite
  17.  * CImpIOleInPlaceSite::~CImpIOleInPlaceSite
  18.  *
  19.  * Parameters (Constructor):
  20.  *  pTen            PCTenant of the tenant we're in.
  21.  *  pUnkOuter       LPUNKNOWN to which we delegate.
  22.  */
  23. CImpIOleInPlaceSite::CImpIOleInPlaceSite(PCTenant pTen
  24.     , LPUNKNOWN pUnkOuter)
  25.     {
  26.     m_cRef=0;
  27.     m_pTen=pTen;
  28.     m_pUnkOuter=pUnkOuter;
  29.     return;
  30.     }
  31. CImpIOleInPlaceSite::~CImpIOleInPlaceSite(void)
  32.     {
  33.     return;
  34.     }
  35. /*
  36.  * CImpIOleInPlaceSite::QueryInterface
  37.  * CImpIOleInPlaceSite::AddRef
  38.  * CImpIOleInPlaceSite::Release
  39.  *
  40.  * Purpose:
  41.  *  IUnknown members for CImpIOleInPlaceSite object.
  42.  */
  43. STDMETHODIMP CImpIOleInPlaceSite::QueryInterface(REFIID riid
  44.     , PPVOID ppv)
  45.     {
  46.     return m_pUnkOuter->QueryInterface(riid, ppv);
  47.     }
  48. STDMETHODIMP_(ULONG) CImpIOleInPlaceSite::AddRef(void)
  49.     {
  50.     ++m_cRef;
  51.     return m_pUnkOuter->AddRef();
  52.     }
  53. STDMETHODIMP_(ULONG) CImpIOleInPlaceSite::Release(void)
  54.     {
  55.     --m_cRef;
  56.     return m_pUnkOuter->Release();
  57.     }
  58. /*
  59.  * CImpIOleInPlaceActiveObject::GetWindow
  60.  *
  61.  * Purpose:
  62.  *  Retrieves the handle of the window associated with the object
  63.  *  on which this interface is implemented.
  64.  *
  65.  * Parameters:
  66.  *  phWnd           HWND * in which to store the window handle.
  67.  *
  68.  * Return Value:
  69.  *  HRESULT         NOERROR if successful, E_FAIL if there is no
  70.  *                  window.
  71.  */
  72. STDMETHODIMP CImpIOleInPlaceSite::GetWindow(HWND *phWnd)
  73.     {
  74.     *phWnd=m_pTen->m_hWnd;
  75.     return NOERROR;
  76.     }
  77. /*
  78.  * CImpIOleInPlaceActiveObject::ContextSensitiveHelp
  79.  *
  80.  * Purpose:
  81.  *  Instructs the object on which this interface is implemented to
  82.  *  enter or leave a context-sensitive help mode.
  83.  *
  84.  * Parameters:
  85.  *  fEnterMode      BOOL TRUE to enter the mode, FALSE otherwise.
  86.  *
  87.  * Return Value:
  88.  *  HRESULT         NOERROR
  89.  */
  90. STDMETHODIMP CImpIOleInPlaceSite::ContextSensitiveHelp
  91.     (BOOL fEnterMode)
  92.     {
  93.     return NOERROR;
  94.     }
  95. /*
  96.  * CImpIOleInPlaceSite::CanInPlaceActivate
  97.  *
  98.  * Purpose:
  99.  *  Answers the server whether or not we can currently in-place
  100.  *  activate its object.  By implementing this interface we say
  101.  *  that we support in-place activation, but through this function
  102.  *  we indicate whether the object can currently be activated
  103.  *  in-place.  Iconic aspects, for example, cannot, meaning we
  104.  *  return S_FALSE.
  105.  *
  106.  * Parameters:
  107.  *  None
  108.  *
  109.  * Return Value:
  110.  *  HRESULT         NOERROR if we can in-place activate the object
  111.  *                  in this site, S_FALSE if not.
  112.  */
  113. STDMETHODIMP CImpIOleInPlaceSite::CanInPlaceActivate(void)
  114.     {
  115.     if (DVASPECT_CONTENT!=m_pTen->m_fe.dwAspect)
  116.         return ResultFromScode(S_FALSE);
  117.     if (TENANTTYPE_EMBEDDEDOBJECT!=m_pTen->m_tType)
  118.         return ResultFromScode(S_FALSE);
  119.     //CHAPTER24MOD
  120.     if (m_pTen->m_pPG->m_fDesignMode)
  121.         return ResultFromScode(S_FALSE);
  122.     //End CHAPTER24MOD
  123.     return NOERROR;
  124.     }
  125. /*
  126.  * CImpIOleInPlaceSite::OnInPlaceActivate
  127.  *
  128.  * Purpose:
  129.  *  Informs the container that an object is being activated in-place
  130.  *  such that the container can prepare appropriately.  The
  131.  *  container does not, however, make any user interface changes at
  132.  *  this point.  See OnUIActivate.
  133.  *
  134.  * Parameters:
  135.  *  None
  136.  *
  137.  * Return Value:
  138.  *  HRESULT         NOERROR or an appropriate error code.
  139.  */
  140. STDMETHODIMP CImpIOleInPlaceSite::OnInPlaceActivate(void)
  141.     {
  142.     //CHAPTER24MOD
  143.     m_pTen->m_fPendingDeactivate=FALSE;
  144.     //End CHAPTER24MOD
  145.     //m_pIOleIPObject is our in-place flag.
  146.     m_pTen->m_pObj->QueryInterface(IID_IOleInPlaceObject
  147.         , (PPVOID)&m_pTen->m_pIOleIPObject);
  148.     return NOERROR;
  149.     }
  150. /*
  151.  * CImpIOleInPlaceSite::OnInPlaceDeactivate
  152.  *
  153.  * Purpose:
  154.  *  Notifies the container that the object has deactivated itself
  155.  *  from an in-place state.  Opposite of OnInPlaceActivate.  The
  156.  *  container does not change any UI at this point.
  157.  *
  158.  * Parameters:
  159.  *  None
  160.  *
  161.  * Return Value:
  162.  *  HRESULT         NOERROR or an appropriate error code.
  163.  */
  164. STDMETHODIMP CImpIOleInPlaceSite::OnInPlaceDeactivate(void)
  165.     {
  166.     /*
  167.      * Since we don't have an Undo command, we can tell the object
  168.      * right away to discard its Undo state.
  169.      */
  170.     m_pTen->Activate(OLEIVERB_DISCARDUNDOSTATE, NULL);
  171.     ReleaseInterface(m_pTen->m_pIOleIPObject);
  172.     return NOERROR;
  173.     }
  174. /*
  175.  * CImpIOleInPlaceSite::OnUIActivate
  176.  *
  177.  * Purpose:
  178.  *  Informs the container that the object is going to start munging
  179.  *  around with user interface, like replacing the menu.  The
  180.  *  container should remove any relevant UI in preparation.
  181.  *
  182.  * Parameters:
  183.  *  None
  184.  *
  185.  * Return Value:
  186.  *  HRESULT         NOERROR or an appropriate error code.
  187.  */
  188. STDMETHODIMP CImpIOleInPlaceSite::OnUIActivate(void)
  189.     {
  190.     PCPatronDoc     pDoc;
  191.     m_pTen->m_pPG->m_fAddUI=FALSE;
  192.     //CHAPTER24MOD
  193.     m_pTen->m_fPendingDeactivate=FALSE;
  194.     //End CHAPTER24MOD
  195.     pDoc=(PCPatronDoc)SendMessage(GetParent(m_pTen->m_hWnd)
  196.         , DOCM_PDOCUMENT, 0, 0L);
  197.     /*
  198.      * Change the currently selected tenant in the page.  This
  199.      * will UIDeactivate the currently UI Active tenant.
  200.      */
  201.     g_fSwitchingActive=TRUE;
  202.     m_pTen->m_pPG->m_pPageCur->SwitchActiveTenant(m_pTen);
  203.     g_fSwitchingActive=FALSE;
  204.     //Hide the frame tools if necessary.
  205.     g_pFR->ShowUIAndTools(pDoc->NoObjectFrameTools(0, FALSE), FALSE);
  206.     return NOERROR;
  207.     }
  208. /*
  209.  * CImpIOleInPlaceSite::OnUIDeactivate
  210.  *
  211.  * Purpose:
  212.  *  Informs the container that the object is deactivating its
  213.  *  in-place user interface at which time the container may
  214.  *  reinstate its own.  Opposite of OnUIActivate.
  215.  *
  216.  * Parameters:
  217.  *  fUndoable       BOOL indicating if the object will actually
  218.  *                  perform an Undo if the container calls
  219.  *                  ReactivateAndUndo.
  220.  *
  221.  * Return Value:
  222.  *  HRESULT         NOERROR or an appropriate error code.
  223.  */
  224. STDMETHODIMP CImpIOleInPlaceSite::OnUIDeactivate(BOOL fUndoable)
  225.     {
  226.     PCDocument  pDoc;
  227.     MSG         msg;
  228.     /*
  229.      * Ignore this notification if we're switching between
  230.      * multiple active objects.
  231.      */
  232.     if (g_fSwitchingActive)
  233.         return NOERROR;
  234.     //If in shutdown (NULL storage), don't check messages.
  235.     if (NULL==m_pTen->m_pIStorage)
  236.         {
  237.         g_pFR->ReinstateUI();
  238.         return NOERROR;
  239.         }
  240.     pDoc=(PCDocument)SendMessage(GetParent(m_pTen->m_hWnd)
  241.         , DOCM_PDOCUMENT, 0, 0L);
  242.     //If there's a pending double-click, delay showing our UI
  243.     if (!PeekMessage(&msg, pDoc->Window(), WM_LBUTTONDBLCLK
  244.         , WM_LBUTTONDBLCLK, PM_NOREMOVE | PM_NOYIELD))
  245.         {
  246.         //Turn everything back on.
  247.         g_pFR->ReinstateUI();
  248.         }
  249.     else
  250.         m_pTen->m_pPG->m_fAddUI=TRUE;
  251.     SetFocus(pDoc->Window());
  252.     return NOERROR;
  253.     }
  254. /*
  255.  * CImpIOleInPlaceSite::DeactivateAndUndo
  256.  *
  257.  * Purpose:
  258.  *  If immediately after activation the object does an Undo, the
  259.  *  action being undone is the activation itself, and this call
  260.  *  informs the container that this is, in fact, what happened.
  261.  *  The container should call IOleInPlaceObject::UIDeactivate.
  262.  *
  263.  * Parameters:
  264.  *  None
  265.  *
  266.  * Return Value:
  267.  *  HRESULT         NOERROR or an appropriate error code.
  268.  */
  269. STDMETHODIMP CImpIOleInPlaceSite::DeactivateAndUndo(void)
  270.     {
  271.     //CHAPTER24MOD
  272.     /*
  273.      * Note that we don't pay attention to the locking
  274.      * from IOleControlSite::LockInPlaceActive since only
  275.      * the object calls this function and should know
  276.      * that it's going to be deactivated.
  277.      */
  278.     //End CHAPTER24MOD
  279.     m_pTen->m_pIOleIPObject->InPlaceDeactivate();
  280.     return NOERROR;
  281.     }
  282. /*
  283.  * CImpIOleInPlaceSite::DiscardUndoState
  284.  *
  285.  * Purpose:
  286.  *  Informs the container that something happened in the object
  287.  *  that means the container should discard any undo information
  288.  *  it currently maintains for the object.
  289.  *
  290.  * Parameters:
  291.  *  None
  292.  *
  293.  * Return Value:
  294.  *  HRESULT         NOERROR or an appropriate error code.
  295.  */
  296. STDMETHODIMP CImpIOleInPlaceSite::DiscardUndoState(void)
  297.     {
  298.     return ResultFromScode(E_NOTIMPL);
  299.     }
  300. /*
  301.  * CImpIOleInPlaceSite::GetWindowContext
  302.  *
  303.  * Purpose:
  304.  *  Provides an in-place object with pointers to the frame and
  305.  *  document level in-place interfaces (IOleInPlaceFrame and
  306.  *  IOleInPlaceUIWindow) such that the object can do border
  307.  *  negotiation and so forth.  Also requests the position and
  308.  *  clipping rectangles of the object in the container and a
  309.  *  pointer to an OLEINPLACEFRAME info structure which contains
  310.  *  accelerator information.
  311.  *
  312.  *  Note that the two interfaces this call returns are not
  313.  *  available through QueryInterface on IOleInPlaceSite since they
  314.  *  live with the frame and document, but not the site.
  315.  *
  316.  * Parameters:
  317.  *  ppIIPFrame      LPOLEINPLACEFRAME * in which to return the
  318.  *                  AddRef'd pointer to the container's
  319.  *                  IOleInPlaceFrame.
  320.  *  ppIIPUIWindow   LPOLEINPLACEUIWINDOW * in which to return
  321.  *                  the AddRef'd pointer to the container document's
  322.  *                  IOleInPlaceUIWindow.
  323.  *  prcPos          LPRECT in which to store the object's position.
  324.  *  prcClip         LPRECT in which to store the object's visible
  325.  *                  region.
  326.  *  pFI             LPOLEINPLACEFRAMEINFO to fill with accelerator
  327.  *                  stuff.
  328.  *
  329.  * Return Value:
  330.  *  HRESULT         NOERROR
  331.  */
  332. STDMETHODIMP CImpIOleInPlaceSite::GetWindowContext
  333.     (LPOLEINPLACEFRAME *ppIIPFrame, LPOLEINPLACEUIWINDOW
  334.     *ppIIPUIWindow, LPRECT prcPos, LPRECT prcClip
  335.     , LPOLEINPLACEFRAMEINFO pFI)
  336.     {
  337.     PCPatronDoc     pDoc;
  338.     RECTL           rcl;
  339.     *ppIIPUIWindow=NULL;
  340.     *ppIIPFrame=(LPOLEINPLACEFRAME)g_pFR;
  341.     g_pFR->AddRef();
  342.     pDoc=(PCPatronDoc)SendMessage(GetParent(m_pTen->m_hWnd)
  343.         , DOCM_PDOCUMENT, 0, 0L);
  344.     if (NULL!=pDoc)
  345.         {
  346.         pDoc->QueryInterface(IID_IOleInPlaceUIWindow
  347.             , (PPVOID)ppIIPUIWindow);
  348.         }
  349.     //Now get the rectangles and frame information.
  350.     m_pTen->RectGet(&rcl, TRUE);
  351.     RECTFROMRECTL(*prcPos, rcl);
  352.     //Include scroll position here.
  353.     OffsetRect(prcPos, -(int)m_pTen->m_pPG->m_xPos
  354.         , -(int)m_pTen->m_pPG->m_yPos);
  355.     SetRect(prcClip, 0, 0, 32767, 32767);
  356.     pFI->cb=sizeof(OLEINPLACEFRAMEINFO);
  357.    #ifdef MDI
  358.     pFI->fMDIApp=TRUE;
  359.    #else
  360.     pFI->fMDIApp=FALSE;
  361.    #endif
  362.     pFI->hwndFrame=g_pFR->Window();
  363.     pFI->haccel=g_pFR->m_hAccelIP;
  364.     pFI->cAccelEntries=CINPLACEACCELERATORS;
  365.     return NOERROR;
  366.     }
  367. /*
  368.  * CImpIOleInPlaceSite::Scroll
  369.  *
  370.  * Purpose:
  371.  *  Asks the container to scroll the document, and thus the object,
  372.  *  by the given amounts in the sz parameter.
  373.  *
  374.  * Parameters:
  375.  *  sz              SIZE containing signed horizontal and vertical
  376.  *                  extents by which the container should scroll.
  377.  *                  These are in device units.
  378.  *
  379.  * Return Value:
  380.  *  HRESULT         NOERROR
  381.  */
  382. STDMETHODIMP CImpIOleInPlaceSite::Scroll(SIZE sz)
  383.     {
  384.     int         x, y;
  385.     x=m_pTen->m_pPG->m_xPos+sz.cx;
  386.     y=m_pTen->m_pPG->m_yPos+sz.cy;
  387.     SendScrollPosition(m_pTen->m_hWnd, WM_HSCROLL, x);
  388.     SendScrollPosition(m_pTen->m_hWnd, WM_VSCROLL, y);
  389.     return NOERROR;
  390.     }
  391. /*
  392.  * CImpIOleInPlaceSite::OnPosRectChange
  393.  *
  394.  * Purpose:
  395.  *  Informs the container that the in-place object was resized.
  396.  *  The container must call IOleInPlaceObject::SetObjectRects.
  397.  *  This does not change the site's rectangle in any case.
  398.  *
  399.  * Parameters:
  400.  *  prcPos          LPCRECT containing the new size of the object.
  401.  *
  402.  * Return Value:
  403.  *  HRESULT         NOERROR
  404.  */
  405. STDMETHODIMP CImpIOleInPlaceSite::OnPosRectChange(LPCRECT prcPos)
  406.     {
  407.     if (NULL!=prcPos)
  408.         m_pTen->m_rcPos=*prcPos;
  409.     m_pTen->UpdateInPlaceObjectRects(prcPos, FALSE);
  410.     return NOERROR;
  411.     }