home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / inole2 / chap24 / polyline / iipaobj.cpp < prev    next >
C/C++ Source or Header  |  1995-05-03  |  7KB  |  299 lines

  1. /*
  2.  * IIPAOBJ.CPP
  3.  * Polyline Component Chapter 24
  4.  *
  5.  * IOleInPlaceActiveObject interface implementation for Polyline
  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.  
  14.  
  15. #include "polyline.h"
  16.  
  17.  
  18. /*
  19.  * CImpIOleInPlaceActiveObject::CImpIOleInPlaceActiveObject
  20.  * CImpIOleInPlaceActiveObject::~CImpIOleInPlaceActiveObject
  21.  *
  22.  * Parameters (Constructor):
  23.  *  pObj            PCPolyline of the object we're in.
  24.  *  pUnkOuter       LPUNKNOWN to which we delegate.
  25.  */
  26.  
  27. CImpIOleInPlaceActiveObject::CImpIOleInPlaceActiveObject
  28.     (PCPolyline pObj, LPUNKNOWN pUnkOuter)
  29.     {
  30.     m_cRef=0;
  31.     m_pObj=pObj;
  32.     m_pUnkOuter=pUnkOuter;
  33.     return;
  34.     }
  35.  
  36. CImpIOleInPlaceActiveObject::~CImpIOleInPlaceActiveObject(void)
  37.     {
  38.     return;
  39.     }
  40.  
  41.  
  42.  
  43. /*
  44.  * CImpIOleInPlaceActiveObject::QueryInterface
  45.  * CImpIOleInPlaceActiveObject::AddRef
  46.  * CImpIOleInPlaceActiveObject::Release
  47.  *
  48.  * Purpose:
  49.  *  IUnknown members for CImpIOleInPlaceActiveObject object.
  50.  */
  51.  
  52. STDMETHODIMP CImpIOleInPlaceActiveObject::QueryInterface(REFIID riid
  53.     , PPVOID ppv)
  54.     {
  55.     /*
  56.      * This interface should be stand-alone on an object such that a
  57.      * container cannot QueryInterface for it through any other
  58.      * object interface, relying instead of calls to SetActiveObject
  59.      * for it.  By implementing QueryInterface here ourselves, we
  60.      * prevent such abuses.  Note that reference counting still uses
  61.      * CFigure.
  62.      */
  63.  
  64.     *ppv=NULL;
  65.  
  66.     if (IID_IUnknown==riid || IID_IOleWindow==riid
  67.         || IID_IOleInPlaceActiveObject==riid)
  68.         *ppv=this;
  69.  
  70.     //AddRef any interface we'll return.
  71.     if (NULL!=*ppv)
  72.         {
  73.         ((LPUNKNOWN)*ppv)->AddRef();
  74.         return NOERROR;
  75.         }
  76.  
  77.     return ResultFromScode(E_NOINTERFACE);
  78.     }
  79.  
  80.  
  81. STDMETHODIMP_(ULONG) CImpIOleInPlaceActiveObject::AddRef(void)
  82.     {
  83.     ++m_cRef;
  84.     return m_pUnkOuter->AddRef();
  85.     }
  86.  
  87. STDMETHODIMP_(ULONG) CImpIOleInPlaceActiveObject::Release(void)
  88.     {
  89.     --m_cRef;
  90.     return m_pUnkOuter->Release();
  91.     }
  92.  
  93.  
  94.  
  95.  
  96. /*
  97.  * CImpIOleInPlaceActiveObject::GetWindow
  98.  *
  99.  * Purpose:
  100.  *  Retrieves the handle of the window associated with the object on
  101.  *  which this interface is implemented.
  102.  *
  103.  * Parameters:
  104.  *  phWnd           HWND * in which to store the window handle.
  105.  *
  106.  * Return Value:
  107.  *  HRESULT         NOERROR if successful, E_FAIL if there is no
  108.  *                  window.
  109.  */
  110.  
  111. STDMETHODIMP CImpIOleInPlaceActiveObject::GetWindow(HWND *phWnd)
  112.     {
  113.     *phWnd=m_pObj->m_pHW->Window();;
  114.     return NOERROR;
  115.     }
  116.  
  117.  
  118.  
  119.  
  120. /*
  121.  * CImpIOleInPlaceActiveObject::ContextSensitiveHelp
  122.  *
  123.  * Purpose:
  124.  *  Instructs the object on which this interface is implemented to
  125.  *  enter or leave a context-sensitive help mode.
  126.  *
  127.  * Parameters:
  128.  *  fEnterMode      BOOL TRUE to enter the mode, FALSE otherwise.
  129.  *
  130.  * Return Value:
  131.  *  HRESULT         NOERROR or an error code.
  132.  */
  133.  
  134. STDMETHODIMP CImpIOleInPlaceActiveObject::ContextSensitiveHelp
  135.     (BOOL fEnterMode)
  136.     {
  137.     return ResultFromScode(E_NOTIMPL);
  138.     }
  139.  
  140.  
  141.  
  142.  
  143. /*
  144.  * CImpIOleInPlaceActiveObject::TranslateAccelerator
  145.  *
  146.  * Purpose:
  147.  *  Requests that the active in-place object translate the message
  148.  *  given in pMSG if appropriate.  This is only called for DLL
  149.  *  servers where the container's message loop is running.  EXE
  150.  *  servers have control of the message loop so this will not be
  151.  *  called in such cases.
  152.  *
  153.  * Parameters:
  154.  *  pMSG            LPMSG to the message to translate.
  155.  *
  156.  * Return Value:
  157.  *  HRESULT         NOERROR if translates, S_FALSE if not.
  158.  */
  159.  
  160. STDMETHODIMP CImpIOleInPlaceActiveObject::TranslateAccelerator
  161.     (LPMSG pMSG)
  162.     {
  163.     //We have no accelerators, but this is called anyway
  164.     return ResultFromScode(S_FALSE);
  165.     }
  166.  
  167.  
  168.  
  169.  
  170. /*
  171.  * CImpIOleInPlaceActiveObject::OnFrameWindowActivate
  172.  *
  173.  * Purpose:
  174.  *  Informs the in-place object that the container's frame window
  175.  *  was either activated or deactivated.  Not currently used.
  176.  *
  177.  * Parameters:
  178.  *  fActivate       BOOL TRUE if the frame is active,
  179.  *                  FALSE otherwise
  180.  *
  181.  * Return Value:
  182.  *  HRESULT         NOERROR or an error code.
  183.  */
  184.  
  185. STDMETHODIMP CImpIOleInPlaceActiveObject::OnFrameWindowActivate
  186.     (BOOL fActivate)
  187.     {
  188.     return ResultFromScode(E_NOTIMPL);
  189.     }
  190.  
  191.  
  192.  
  193.  
  194. /*
  195.  * CImpIOleInPlaceActiveObject::OnDocWindowActivate
  196.  *
  197.  * Purpose:
  198.  *  Informs the in-place object that the document window in the
  199.  *  container is either becoming active or deactive.  On this call
  200.  *  the object must either add or remove frame-level tools,
  201.  *  including the mixed menu, depending on fActivate.
  202.  *
  203.  * Parameters:
  204.  *  fActivate       BOOL TRUE if the document is active,
  205.  *                  FALSE otherwise
  206.  *
  207.  * Return Value:
  208.  *  HRESULT         NOERROR or an error code.
  209.  */
  210.  
  211. STDMETHODIMP CImpIOleInPlaceActiveObject::OnDocWindowActivate
  212.     (BOOL fActivate)
  213.     {
  214.     if (NULL==m_pObj->m_pIOleIPFrame)
  215.         return NOERROR;
  216.  
  217.     if (fActivate)
  218.         {
  219.        #ifdef WIN32ANSI
  220.         OLECHAR     szTemp[40];
  221.  
  222.         MultiByteToWideChar(CP_ACP, 0
  223.             , (*m_pObj->m_pST)[IDS_USERTYPE], -1, szTemp, 40);
  224.         m_pObj->m_pIOleIPFrame->SetActiveObject(this
  225.             , szTemp);
  226.        #else
  227.         m_pObj->m_pIOleIPFrame->SetActiveObject(this
  228.             , (*m_pObj->m_pST)[IDS_USERTYPE]);
  229.        #endif
  230.  
  231.         m_pObj->m_pIOleIPFrame->SetMenu(m_pObj->m_hMenuShared
  232.             , m_pObj->m_hOLEMenu, m_pObj->m_hWnd);
  233.  
  234.         //Nothing to do with tools.
  235.         }
  236.     else
  237.         {
  238.         m_pObj->m_pIOleIPFrame->SetActiveObject(NULL, NULL);
  239.         }
  240.  
  241.     return NOERROR;
  242.     }
  243.  
  244.  
  245.  
  246.  
  247. /*
  248.  * CImpIOleInPlaceActiveObject::ResizeBorder
  249.  *
  250.  * Purpose:
  251.  *  Informs the object that the frame or document size changed in
  252.  *  which case the object may need to resize any of its frame or
  253.  *  document-level tools to match.
  254.  *
  255.  * Parameters:
  256.  *  pRect           LPCRECT indicating the new size of the window
  257.  *                  of interest.
  258.  *  pIUIWindow      LPOLEINPLACEUIWINDOW pointing to an
  259.  *                  IOleInPlaceUIWindow interface on the container
  260.  *                  object of interest.  We use this to do
  261.  *                  border-space negotiation.
  262.  *
  263.  *  fFrame          BOOL indicating if the frame was resized (TRUE)
  264.  *                  or the document (FALSE)
  265.  *
  266.  * Return Value:
  267.  *  HRESULT         NOERROR or an error code.
  268.  */
  269.  
  270. STDMETHODIMP CImpIOleInPlaceActiveObject::ResizeBorder(LPCRECT pRect
  271.     , LPOLEINPLACEUIWINDOW pIUIWindow, BOOL fFrame)
  272.     {
  273.     return ResultFromScode(E_NOTIMPL);
  274.     }
  275.  
  276.  
  277.  
  278.  
  279. /*
  280.  * CImpIOleInPlaceActiveObject::EnableModeless
  281.  *
  282.  * Purpose:
  283.  *  Instructs the object to show or hide any modeless popup windows
  284.  *  that it may be using when activated in-place.
  285.  *
  286.  * Parameters:
  287.  *  fEnable         BOOL indicating to enable/show the windows
  288.  *                  (TRUE) or to hide them (FALSE).
  289.  *
  290.  * Return Value:
  291.  *  HRESULT         NOERROR or an error code.
  292.  */
  293.  
  294. STDMETHODIMP CImpIOleInPlaceActiveObject::EnableModeless
  295.     (BOOL fActivate)
  296.     {
  297.     return ResultFromScode(E_NOTIMPL);
  298.     }
  299.