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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * IDATAOBJ.CPP
  3.  * Polyline Component Chapter 21
  4.  *
  5.  * Implementation of the IDataObject interface.
  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 "polyline.h"
  14. /*
  15.  * CImpIDataObject::CImpIDataObject
  16.  * CImpIDataObject::~CImpIDataObject
  17.  *
  18.  * Parameters (Constructor):
  19.  *  pObj            PCPolyline of the object we're in.
  20.  *  pUnkOuter       LPUNKNOWN to which we delegate.
  21.  */
  22. CImpIDataObject::CImpIDataObject(PCPolyline pObj
  23.     , LPUNKNOWN pUnkOuter)
  24.     {
  25.     m_cRef=0;
  26.     m_pObj=pObj;
  27.     m_pUnkOuter=pUnkOuter;
  28.     return;
  29.     }
  30. CImpIDataObject::~CImpIDataObject(void)
  31.     {
  32.     return;
  33.     }
  34. /*
  35.  * CImpIDataObject::QueryInterface
  36.  * CImpIDataObject::AddRef
  37.  * CImpIDataObject::Release
  38.  */
  39. STDMETHODIMP CImpIDataObject::QueryInterface(REFIID riid, PPVOID ppv)
  40.     {
  41.     return m_pUnkOuter->QueryInterface(riid, ppv);
  42.     }
  43. STDMETHODIMP_(ULONG) CImpIDataObject::AddRef(void)
  44.     {
  45.     ++m_cRef;
  46.     return m_pUnkOuter->AddRef();
  47.     }
  48. STDMETHODIMP_(ULONG) CImpIDataObject::Release(void)
  49.     {
  50.     --m_cRef;
  51.     return m_pUnkOuter->Release();
  52.     }
  53. /*
  54.  * CImpIDataObject::GetData
  55.  *
  56.  * Purpose:
  57.  *  Retrieves data described by a specific FormatEtc into a StgMedium
  58.  *  allocated by this function.  Used like GetClipboardData.
  59.  *
  60.  * Parameters:
  61.  *  pFE             LPFORMATETC describing the desired data.
  62.  *  pSTM            LPSTGMEDIUM in which to return the data.
  63.  *
  64.  * Return Value:
  65.  *  HRESULT         NOERROR or a general error value.
  66.  */
  67. STDMETHODIMP CImpIDataObject::GetData(LPFORMATETC pFE
  68.     , LPSTGMEDIUM pSTM)
  69.     {
  70.     UINT            cf=pFE->cfFormat;
  71.     //Check the aspects we support.
  72.     if (!(DVASPECT_CONTENT & pFE->dwAspect))
  73.         return ResultFromScode(DATA_E_FORMATETC);
  74.     pSTM->pUnkForRelease=NULL;
  75.     //Run creates the window to use as a basis for extents
  76.     m_pObj->m_pImpIRunnableObject->Run(NULL);
  77.     //Go render the appropriate data for the format.
  78.     switch (cf)
  79.         {
  80.         case CF_METAFILEPICT:
  81.             pSTM->tymed=TYMED_MFPICT;
  82.             return m_pObj->RenderMetafilePict(&pSTM->hGlobal);
  83.         case CF_BITMAP:
  84.             pSTM->tymed=TYMED_GDI;
  85.             return m_pObj->RenderBitmap((HBITMAP *)&pSTM->hGlobal);
  86.         default:
  87.             if (cf==m_pObj->m_cf)
  88.                 {
  89.                 pSTM->tymed=TYMED_HGLOBAL;
  90.                 return m_pObj->RenderNative(&pSTM->hGlobal);
  91.                 }
  92.             break;
  93.         }
  94.     return ResultFromScode(DATA_E_FORMATETC);
  95.     }
  96. /*
  97.  * CImpIDataObject::GetDataHere
  98.  *
  99.  * Purpose:
  100.  *  Renders the specific FormatEtc into caller-allocated medium
  101.  *  provided in pSTM.
  102.  *
  103.  * Parameters:
  104.  *  pFE             LPFORMATETC describing the desired data.
  105.  *  pSTM            LPSTGMEDIUM providing the medium into which
  106.  *                  wer render the data.
  107.  *
  108.  * Return Value:
  109.  *  HRESULT         NOERROR or a general error value.
  110.  */
  111. STDMETHODIMP CImpIDataObject::GetDataHere(LPFORMATETC pFE
  112.     , LPSTGMEDIUM pSTM)
  113.     {
  114.     UINT        cf;
  115.     HRESULT     hr;
  116.     /*
  117.      * The only reasonable time this is called is for
  118.      * CFSTR_EMBEDSOURCE and TYMED_ISTORAGE (and later for
  119.      * CFSTR_LINKSOURCE).  This means the same as
  120.      * IPersistStorage::Save.
  121.      */
  122.     cf=RegisterClipboardFormat(CFSTR_EMBEDSOURCE);
  123.     //Aspect is unimportant to us here, as is lindex and ptd.
  124.     if (cf==pFE->cfFormat && (TYMED_ISTORAGE & pFE->tymed))
  125.         {
  126.         //We have an IStorage we can write into.
  127.         pSTM->tymed=TYMED_ISTORAGE;
  128.         pSTM->pUnkForRelease=NULL;
  129.         hr=m_pObj->m_pImpIPersistStorage->Save(pSTM->pstg, FALSE);
  130.         m_pObj->m_pImpIPersistStorage->SaveCompleted(NULL);
  131.         return hr;
  132.         }
  133.     return ResultFromScode(DATA_E_FORMATETC);
  134.     }
  135. /*
  136.  * CImpIDataObject::QueryGetData
  137.  *
  138.  * Purpose:
  139.  *  Tests if a call to GetData with this FormatEtc will provide
  140.  *  any rendering; used like IsClipboardFormatAvailable.
  141.  *
  142.  * Parameters:
  143.  *  pFE             LPFORMATETC describing the desired data.
  144.  *
  145.  * Return Value:
  146.  *  HRESULT         NOERROR or a general error value.
  147.  */
  148. STDMETHODIMP CImpIDataObject::QueryGetData(LPFORMATETC pFE)
  149.     {
  150.     UINT            cf=pFE->cfFormat;
  151.     BOOL            fRet=FALSE;
  152.     //Check the aspects we support.
  153.     if (!(DVASPECT_CONTENT & pFE->dwAspect))
  154.         return ResultFromScode(DATA_E_FORMATETC);
  155.     switch (cf)
  156.         {
  157.         case CF_METAFILEPICT:
  158.             fRet=(BOOL)(pFE->tymed & TYMED_MFPICT);
  159.             break;
  160.         case CF_BITMAP:
  161.             fRet=(BOOL)(pFE->tymed & TYMED_GDI);
  162.             break;
  163.         default:
  164.             //Check our own format.
  165.             fRet=((cf==m_pObj->m_cf)
  166.                 && (BOOL)(pFE->tymed & TYMED_HGLOBAL));
  167.             break;
  168.         }
  169.     return fRet ? NOERROR : ResultFromScode(S_FALSE);
  170.     }
  171. /*
  172.  * CImpIDataObject::GetCanonicalFormatEtc
  173.  *
  174.  * Purpose:
  175.  *  Provides the caller with an equivalent FormatEtc to the one
  176.  *  provided when different FormatEtcs will produce exactly the
  177.  *  same renderings.
  178.  *
  179.  * Parameters:
  180.  *  pFEIn            LPFORMATETC of the first description.
  181.  *  pFEOut           LPFORMATETC of the equal description.
  182.  *
  183.  * Return Value:
  184.  *  HRESULT         NOERROR or a general error value.
  185.  */
  186. STDMETHODIMP CImpIDataObject::GetCanonicalFormatEtc
  187.     (LPFORMATETC pFEIn, LPFORMATETC pFEOut)
  188.     {
  189.     if (NULL==pFEOut)
  190.         return ResultFromScode(E_INVALIDARG);
  191.     pFEOut->ptd=NULL;
  192.     return ResultFromScode(DATA_S_SAMEFORMATETC);
  193.     }
  194. /*
  195.  * CImpIDataObject::SetData
  196.  *
  197.  * Purpose:
  198.  *  Places data described by a FormatEtc and living in a StgMedium
  199.  *  into the object.  The object may be responsible to clean up the
  200.  *  StgMedium before exiting.
  201.  *
  202.  * Parameters:
  203.  *  pFE             LPFORMATETC describing the data to set.
  204.  *  pSTM            LPSTGMEDIUM containing the data.
  205.  *  fRelease        BOOL indicating if this function is responsible
  206.  *                  for freeing the data.
  207.  *
  208.  * Return Value:
  209.  *  HRESULT         NOERROR or a general error value.
  210.  */
  211. STDMETHODIMP CImpIDataObject::SetData(LPFORMATETC pFE
  212.     , LPSTGMEDIUM pSTM, BOOL fRelease)
  213.     {
  214.     UINT            cf=pFE->cfFormat;
  215.     BOOL            fRet=FALSE;
  216.     PPOLYLINEDATA   ppl;
  217.     //Check for our own clipboard format and DVASPECT_CONTENT
  218.     if ((cf!=m_pObj->m_cf) || !(DVASPECT_CONTENT & pFE->dwAspect))
  219.         return ResultFromScode(DATA_E_FORMATETC);
  220.     /*
  221.      * Data can only come from global memory containing a
  222.      * POLYLINEDATA structure that we send to the Polyline's
  223.      * DataSet, a now internal function used from here and
  224.      * from IPersistStorage::Load.
  225.      */
  226.     if (TYMED_HGLOBAL!=pSTM->tymed)
  227.         return ResultFromScode(DATA_E_FORMATETC);
  228.     ppl=(PPOLYLINEDATA)GlobalLock(pSTM->hGlobal);
  229.     if (NULL!=ppl)
  230.         {
  231.         m_pObj->DataSet(ppl, TRUE, TRUE);
  232.         GlobalUnlock(pSTM->hGlobal);
  233.         fRet=TRUE;
  234.         }
  235.     if (fRelease)
  236.         ReleaseStgMedium(pSTM);
  237.     return fRet ? NOERROR : ResultFromScode(DATA_E_FORMATETC);
  238.     }
  239. /*
  240.  * CImpIDataObject::EnumFormatEtc
  241.  *
  242.  * Purpose:
  243.  *  Returns an IEnumFORMATETC object through which the caller can
  244.  *  iterate to learn about all the data formats this object can
  245.  *  provide through either GetData[Here] or SetData.
  246.  *
  247.  * Parameters:
  248.  *  dwDir           DWORD describing a data direction, either
  249.  *                  DATADIR_SET or DATADIR_GET.
  250.  *  ppEnum          LPENUMFORMATETC * in which to return the
  251.  *                  pointer to the enumerator.
  252.  *
  253.  * Return Value:
  254.  *  HRESULT         NOERROR or a general error value.
  255.  */
  256. STDMETHODIMP CImpIDataObject::EnumFormatEtc(DWORD dwDir
  257.     , LPENUMFORMATETC *ppEnum)
  258.     {
  259.     return m_pObj->m_pDefIDataObject->EnumFormatEtc(dwDir, ppEnum);
  260.     }
  261. /*
  262.  * CImpIDataObject::DAdvise
  263.  * CImpIDataObject::DUnadvise
  264.  * CImpIDataObject::EnumDAdvise
  265.  */
  266. STDMETHODIMP CImpIDataObject::DAdvise(LPFORMATETC pFE, DWORD dwFlags
  267.     , LPADVISESINK pIAdviseSink, LPDWORD pdwConn)
  268.     {
  269.     HRESULT         hr;
  270.     if (NULL==m_pObj->m_pIDataAdviseHolder)
  271.         {
  272.         hr=CreateDataAdviseHolder(&m_pObj->m_pIDataAdviseHolder);
  273.         if (FAILED(hr))
  274.             return ResultFromScode(E_OUTOFMEMORY);
  275.         }
  276.     hr=m_pObj->m_pIDataAdviseHolder->Advise(this, pFE
  277.         , dwFlags, pIAdviseSink, pdwConn);
  278.     return hr;
  279.     }
  280. STDMETHODIMP CImpIDataObject::DUnadvise(DWORD dwConn)
  281.     {
  282.     HRESULT         hr;
  283.     if (NULL==m_pObj->m_pIDataAdviseHolder)
  284.         return ResultFromScode(E_FAIL);
  285.     hr=m_pObj->m_pIDataAdviseHolder->Unadvise(dwConn);
  286.     return hr;
  287.     }
  288. STDMETHODIMP CImpIDataObject::EnumDAdvise(LPENUMSTATDATA *ppEnum)
  289.     {
  290.     HRESULT         hr;
  291.     if (NULL==m_pObj->m_pIDataAdviseHolder)
  292.         return ResultFromScode(E_FAIL);
  293.     hr=m_pObj->m_pIDataAdviseHolder->EnumAdvise(ppEnum);
  294.     return hr;
  295.     }