1 // IDataObjectImpl.h: interface for the CIDataObjectImpl class. 2 /************************************************************************** 3 THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF 4 ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 5 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 6 PARTICULAR PURPOSE. 7 Author: Leon Finker 11/2000 8 Modifications: replaced ATL by STL, Martin Fuchs 7/2003 9 **************************************************************************/ 10 11 #include <vector> 12 using std::vector; 13 14 15 typedef vector<FORMATETC> FormatArray; 16 17 /// structure containing information for one format of EnumFormatEtcImpl 18 struct DataStorage { 19 FORMATETC* _format; 20 STGMEDIUM* _medium; 21 }; 22 23 typedef vector<DataStorage> StorageArray; 24 25 26 /// implementation of IEnumFORMATETC interface 27 class EnumFormatEtcImpl 28 : public IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl>, public SimpleComObject 29 { 30 typedef IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl> super; 31 32 private: 33 ULONG m_cRefCount; 34 FormatArray m_pFmtEtc; 35 size_t m_iCur; 36 37 public: 38 EnumFormatEtcImpl(const FormatArray& ArrFE); 39 EnumFormatEtcImpl(const StorageArray& ArrFE); 40 virtual ~EnumFormatEtcImpl() {} 41 42 //IEnumFORMATETC members 43 virtual HRESULT STDMETHODCALLTYPE Next(ULONG, LPFORMATETC, ULONG*); 44 virtual HRESULT STDMETHODCALLTYPE Skip(ULONG); 45 virtual HRESULT STDMETHODCALLTYPE Reset(void); 46 virtual HRESULT STDMETHODCALLTYPE Clone(IEnumFORMATETC**); 47 }; 48 49 /// implementation of IDropSource interface 50 class IDropSourceImpl 51 : public IComSrvBase<IDropSource, IDropSourceImpl>, public SimpleComObject 52 { 53 typedef IComSrvBase<IDropSource, IDropSourceImpl> super; 54 55 long m_cRefCount; 56 57 public: 58 bool m_bDropped; 59 60 IDropSourceImpl() 61 : super(IID_IDropSource), 62 m_cRefCount(0), 63 m_bDropped(false) 64 { 65 } 66 67 virtual ~IDropSourceImpl() {} 68 69 //IDropSource 70 virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag( 71 /* [in] */ BOOL fEscapePressed, 72 /* [in] */ DWORD grfKeyState); 73 74 virtual HRESULT STDMETHODCALLTYPE GiveFeedback( 75 /* [in] */ DWORD dwEffect); 76 }; 77 78 /// implementation of IDataObject interface 79 class IDataObjectImpl 80 : public IComSrvBase<IDataObject, IDataObjectImpl>, public SimpleComObject 81 //public IAsyncOperation 82 { 83 typedef IComSrvBase<IDataObject, IDataObjectImpl> super; 84 85 IDropSourceImpl* m_pDropSource; 86 long m_cRefCount; 87 88 StorageArray _storage; 89 90 public: 91 IDataObjectImpl(IDropSourceImpl* pDropSource); 92 virtual ~IDataObjectImpl(); 93 94 void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc); 95 96 //IDataObject 97 virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData( 98 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn, 99 /* [out] */ STGMEDIUM __RPC_FAR *pmedium); 100 101 virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere( 102 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc, 103 /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium); 104 105 virtual HRESULT STDMETHODCALLTYPE QueryGetData( 106 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc); 107 108 virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc( 109 /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn, 110 /* [out] */ FORMATETC __RPC_FAR *pformatetcOut); 111 112 virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData( 113 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc, 114 /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium, 115 /* [in] */ BOOL fRelease); 116 117 virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc( 118 /* [in] */ DWORD dwDirection, 119 /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc); 120 121 virtual HRESULT STDMETHODCALLTYPE DAdvise( 122 /* [in] */ FORMATETC __RPC_FAR *pformatetc, 123 /* [in] */ DWORD advf, 124 /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink, 125 /* [out] */ DWORD __RPC_FAR *pdwConnection); 126 127 virtual HRESULT STDMETHODCALLTYPE DUnadvise( 128 /* [in] */ DWORD dwConnection); 129 130 virtual HRESULT STDMETHODCALLTYPE EnumDAdvise( 131 /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise); 132 133 //IAsyncOperation 134 //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode( 135 // /* [in] */ BOOL fDoOpAsync) 136 //{ 137 // return E_NOTIMPL; 138 //} 139 // 140 //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode( 141 // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync) 142 //{ 143 // return E_NOTIMPL; 144 //} 145 // 146 //virtual HRESULT STDMETHODCALLTYPE StartOperation( 147 // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved) 148 //{ 149 // return E_NOTIMPL; 150 //} 151 // 152 //virtual HRESULT STDMETHODCALLTYPE InOperation( 153 // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp) 154 //{ 155 // return E_NOTIMPL; 156 //} 157 // 158 //virtual HRESULT STDMETHODCALLTYPE EndOperation( 159 // /* [in] */ HRESULT hResult, 160 // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved, 161 // /* [in] */ DWORD dwEffects) 162 //{ 163 // return E_NOTIMPL; 164 //}*/ 165 }; 166 167 /// implementation of IDropTarget interface 168 class IDropTargetImpl : public IDropTarget 169 { 170 DWORD m_cRefCount; 171 bool m_bAllowDrop; 172 IDropTargetHelper* m_pDropTargetHelper; 173 174 FormatArray m_formatetc; 175 FORMATETC* m_pSupportedFrmt; 176 177 protected: 178 HWND m_hTargetWnd; 179 180 public: 181 IDropTargetImpl(HWND m_hTargetWnd); 182 virtual ~IDropTargetImpl(); 183 184 void AddSuportedFormat(FORMATETC& ftetc) {m_formatetc.push_back(ftetc);} 185 186 //return values: true - release the medium. false - don't release the medium 187 virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) = 0; 188 189 virtual HRESULT STDMETHODCALLTYPE QueryInterface( 190 /* [in] */ REFIID riid, 191 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); 192 virtual ULONG STDMETHODCALLTYPE AddRef() {return ++m_cRefCount;} 193 virtual ULONG STDMETHODCALLTYPE Release(); 194 195 bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect); 196 virtual HRESULT STDMETHODCALLTYPE DragEnter( 197 /* [unique][in] */ IDataObject __RPC_FAR *pDataObj, 198 /* [in] */ DWORD grfKeyState, 199 /* [in] */ POINTL pt, 200 /* [out][in] */ DWORD __RPC_FAR *pdwEffect); 201 virtual HRESULT STDMETHODCALLTYPE DragOver( 202 /* [in] */ DWORD grfKeyState, 203 /* [in] */ POINTL pt, 204 /* [out][in] */ DWORD __RPC_FAR *pdwEffect); 205 virtual HRESULT STDMETHODCALLTYPE DragLeave(); 206 virtual HRESULT STDMETHODCALLTYPE Drop( 207 /* [unique][in] */ IDataObject __RPC_FAR *pDataObj, 208 /* [in] */ DWORD grfKeyState, 209 /* [in] */ POINTL pt, 210 /* [out][in] */ DWORD __RPC_FAR *pdwEffect); 211 }; 212 213 /// implementation of IDragSourceHelper interface 214 class DragSourceHelper 215 { 216 IDragSourceHelper* pDragSourceHelper; 217 218 public: 219 DragSourceHelper() 220 { 221 if (FAILED(CoCreateInstance(CLSID_DragDropHelper, 222 NULL, 223 CLSCTX_INPROC_SERVER, 224 IID_IDragSourceHelper, 225 (void**)&pDragSourceHelper))) 226 pDragSourceHelper = NULL; 227 } 228 229 virtual ~DragSourceHelper() 230 { 231 if (pDragSourceHelper != NULL) 232 { 233 pDragSourceHelper->Release(); 234 pDragSourceHelper=NULL; 235 } 236 } 237 238 // IDragSourceHelper 239 HRESULT InitializeFromBitmap(HBITMAP hBitmap, 240 POINT& pt, // cursor position in client coords of the window 241 RECT& rc, // selected item's bounding rect 242 IDataObject* pDataObject, 243 COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect. 244 ) 245 { 246 if (pDragSourceHelper == NULL) 247 return E_FAIL; 248 249 SHDRAGIMAGE di; 250 BITMAP bm; 251 GetObject(hBitmap, sizeof(bm), &bm); 252 di.sizeDragImage.cx = bm.bmWidth; 253 di.sizeDragImage.cy = bm.bmHeight; 254 di.hbmpDragImage = hBitmap; 255 di.crColorKey = crColorKey; 256 di.ptOffset.x = pt.x - rc.left; 257 di.ptOffset.y = pt.y - rc.top; 258 return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject); 259 } 260 261 HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject) 262 { 263 if (pDragSourceHelper == NULL) 264 return E_FAIL; 265 return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject); 266 } 267 }; 268