dragdropimpl.h

Go to the documentation of this file.
00001 // IDataObjectImpl.h: interface for the CIDataObjectImpl class.
00002 /**************************************************************************
00003    THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
00004    ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
00005    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
00006    PARTICULAR PURPOSE.
00007    Author: Leon Finker  11/2000
00008    Modifications: replaced ATL by STL, Martin Fuchs 7/2003
00009 **************************************************************************/
00010 
00011 #include <vector>
00012 using std::vector;
00013 
00014 
00015 typedef vector<FORMATETC> FormatArray;
00016 
00017  /// structure containing information for one format of EnumFormatEtcImpl
00018 struct DataStorage {
00019     FORMATETC*  _format;
00020     STGMEDIUM*  _medium;
00021 };
00022 
00023 typedef vector<DataStorage> StorageArray;
00024 
00025 
00026  /// implementation of IEnumFORMATETC interface
00027 class EnumFormatEtcImpl
00028  :  public IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl>, public SimpleComObject
00029 {
00030     typedef IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl> super;
00031 
00032 private:
00033      ULONG          m_cRefCount;
00034      FormatArray    m_pFmtEtc;
00035      size_t         m_iCur;
00036 
00037 public:
00038      EnumFormatEtcImpl(const FormatArray& ArrFE);
00039      EnumFormatEtcImpl(const StorageArray& ArrFE);
00040      virtual ~EnumFormatEtcImpl() {}
00041 
00042      //IEnumFORMATETC members
00043      virtual HRESULT STDMETHODCALLTYPE Next(ULONG, LPFORMATETC, ULONG*);
00044      virtual HRESULT STDMETHODCALLTYPE Skip(ULONG);
00045      virtual HRESULT STDMETHODCALLTYPE Reset(void);
00046      virtual HRESULT STDMETHODCALLTYPE Clone(IEnumFORMATETC**);
00047 };
00048 
00049  /// implementation of IDropSource interface
00050 class IDropSourceImpl
00051  :  public IComSrvBase<IDropSource, IDropSourceImpl>, public SimpleComObject
00052 {
00053     typedef IComSrvBase<IDropSource, IDropSourceImpl> super;
00054 
00055     long m_cRefCount;
00056 
00057 public:
00058     bool m_bDropped;
00059 
00060     IDropSourceImpl()
00061      :  super(IID_IDropSource),
00062         m_cRefCount(0),
00063         m_bDropped(false)
00064     {
00065     }
00066 
00067     virtual ~IDropSourceImpl() {}
00068 
00069     //IDropSource
00070     virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(
00071         /* [in] */ BOOL fEscapePressed,
00072         /* [in] */ DWORD grfKeyState);
00073 
00074     virtual HRESULT STDMETHODCALLTYPE GiveFeedback(
00075         /* [in] */ DWORD dwEffect);
00076 };
00077 
00078  /// implementation of IDataObject interface
00079 class IDataObjectImpl
00080  :  public IComSrvBase<IDataObject, IDataObjectImpl>, public SimpleComObject
00081     //public IAsyncOperation
00082 {
00083     typedef IComSrvBase<IDataObject, IDataObjectImpl> super;
00084 
00085     IDropSourceImpl* m_pDropSource;
00086     long m_cRefCount;
00087 
00088     StorageArray    _storage;
00089 
00090 public:
00091     IDataObjectImpl(IDropSourceImpl* pDropSource);
00092     virtual ~IDataObjectImpl();
00093 
00094     void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
00095 
00096     //IDataObject
00097     virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData(
00098         /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,
00099         /* [out] */ STGMEDIUM __RPC_FAR *pmedium);
00100 
00101     virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere(
00102         /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
00103         /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium);
00104 
00105     virtual HRESULT STDMETHODCALLTYPE QueryGetData(
00106         /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc);
00107 
00108     virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(
00109         /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,
00110         /* [out] */ FORMATETC __RPC_FAR *pformatetcOut);
00111 
00112     virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData(
00113         /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
00114         /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,
00115         /* [in] */ BOOL fRelease);
00116 
00117     virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc(
00118         /* [in] */ DWORD dwDirection,
00119         /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc);
00120 
00121     virtual HRESULT STDMETHODCALLTYPE DAdvise(
00122         /* [in] */ FORMATETC __RPC_FAR *pformatetc,
00123         /* [in] */ DWORD advf,
00124         /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,
00125         /* [out] */ DWORD __RPC_FAR *pdwConnection);
00126 
00127     virtual HRESULT STDMETHODCALLTYPE DUnadvise(
00128         /* [in] */ DWORD dwConnection);
00129 
00130     virtual HRESULT STDMETHODCALLTYPE EnumDAdvise(
00131         /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
00132 
00133     //IAsyncOperation
00134     //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
00135     //    /* [in] */ BOOL fDoOpAsync)
00136     //{
00137     //  return E_NOTIMPL;
00138     //}
00139     //
00140     //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
00141     //    /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
00142     //{
00143     //  return E_NOTIMPL;
00144     //}
00145     //
00146     //virtual HRESULT STDMETHODCALLTYPE StartOperation(
00147     //    /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
00148     //{
00149     //  return E_NOTIMPL;
00150     //}
00151     //
00152     //virtual HRESULT STDMETHODCALLTYPE InOperation(
00153     //    /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
00154     //{
00155     //  return E_NOTIMPL;
00156     //}
00157     //
00158     //virtual HRESULT STDMETHODCALLTYPE EndOperation(
00159     //    /* [in] */ HRESULT hResult,
00160     //    /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
00161     //    /* [in] */ DWORD dwEffects)
00162     //{
00163     //  return E_NOTIMPL;
00164     //}*/
00165 };
00166 
00167  /// implementation of IDropTarget interface
00168 class IDropTargetImpl : public IDropTarget
00169 {
00170     DWORD m_cRefCount;
00171     bool m_bAllowDrop;
00172     IDropTargetHelper* m_pDropTargetHelper;
00173 
00174     FormatArray m_formatetc;
00175     FORMATETC* m_pSupportedFrmt;
00176 
00177 protected:
00178     HWND m_hTargetWnd;
00179 
00180 public:
00181     IDropTargetImpl(HWND m_hTargetWnd);
00182     virtual ~IDropTargetImpl();
00183 
00184     void AddSuportedFormat(FORMATETC& ftetc) {m_formatetc.push_back(ftetc);}
00185 
00186     //return values: true - release the medium. false - don't release the medium
00187     virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) = 0;
00188 
00189     virtual HRESULT STDMETHODCALLTYPE QueryInterface(
00190         /* [in] */ REFIID riid,
00191         /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
00192     virtual ULONG STDMETHODCALLTYPE AddRef() {return ++m_cRefCount;}
00193     virtual ULONG STDMETHODCALLTYPE Release();
00194 
00195     bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect);
00196     virtual HRESULT STDMETHODCALLTYPE DragEnter(
00197         /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
00198         /* [in] */ DWORD grfKeyState,
00199         /* [in] */ POINTL pt,
00200         /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
00201     virtual HRESULT STDMETHODCALLTYPE DragOver(
00202         /* [in] */ DWORD grfKeyState,
00203         /* [in] */ POINTL pt,
00204         /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
00205     virtual HRESULT STDMETHODCALLTYPE DragLeave();
00206     virtual HRESULT STDMETHODCALLTYPE Drop(
00207         /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
00208         /* [in] */ DWORD grfKeyState,
00209         /* [in] */ POINTL pt,
00210         /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
00211 };
00212 
00213  /// implementation of IDragSourceHelper interface
00214 class DragSourceHelper
00215 {
00216     IDragSourceHelper* pDragSourceHelper;
00217 
00218 public:
00219     DragSourceHelper()
00220     {
00221         if (FAILED(CoCreateInstance(CLSID_DragDropHelper,
00222                         NULL,
00223                         CLSCTX_INPROC_SERVER,
00224                         IID_IDragSourceHelper,
00225                         (void**)&pDragSourceHelper)))
00226             pDragSourceHelper = NULL;
00227     }
00228 
00229     virtual ~DragSourceHelper()
00230     {
00231         if (pDragSourceHelper != NULL)
00232         {
00233             pDragSourceHelper->Release();
00234             pDragSourceHelper=NULL;
00235         }
00236     }
00237 
00238     // IDragSourceHelper
00239     HRESULT InitializeFromBitmap(HBITMAP hBitmap,
00240         POINT& pt,  // cursor position in client coords of the window
00241         RECT& rc,   // selected item's bounding rect
00242         IDataObject* pDataObject,
00243         COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect.
00244         )
00245     {
00246         if (pDragSourceHelper == NULL)
00247             return E_FAIL;
00248 
00249             SHDRAGIMAGE di;
00250             BITMAP      bm;
00251             GetObject(hBitmap, sizeof(bm), &bm);
00252             di.sizeDragImage.cx = bm.bmWidth;
00253             di.sizeDragImage.cy = bm.bmHeight;
00254             di.hbmpDragImage = hBitmap;
00255             di.crColorKey = crColorKey;
00256             di.ptOffset.x = pt.x - rc.left;
00257             di.ptOffset.y = pt.y - rc.top;
00258         return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);
00259     }
00260 
00261     HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)
00262     {
00263         if (pDragSourceHelper == NULL)
00264             return E_FAIL;
00265         return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);
00266     }
00267 };

ROS Explorer Source Code Documentation
generated on 02.01.2013 by doxygen

ROS Explorer Homepage