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
7 Author: Leon Finker 11/2000
8 Modifications: replaced ATL by STL, Martin Fuchs 7/2003
9 **************************************************************************/
15 typedef vector<FORMATETC> FormatArray;
22 typedef vector<DataStorage> StorageArray;
25 class EnumFormatEtcImpl : public IEnumFORMATETC
29 FormatArray m_pFmtEtc;
33 EnumFormatEtcImpl(const FormatArray& ArrFE);
34 EnumFormatEtcImpl(const StorageArray& ArrFE);
37 STDMETHOD(QueryInterface)(REFIID, void**);
38 STDMETHOD_(ULONG, AddRef)(void);
39 STDMETHOD_(ULONG, Release)(void);
41 //IEnumFORMATETC members
42 STDMETHOD(Next)(ULONG, LPFORMATETC, ULONG*);
43 STDMETHOD(Skip)(ULONG);
44 STDMETHOD(Reset)(void);
45 STDMETHOD(Clone)(IEnumFORMATETC**);
48 ///////////////////////////////////////////////////////////////////////////////////////////////
49 class IDropSourceImpl : public IDropSource
55 IDropSourceImpl::IDropSourceImpl() : m_cRefCount(0), m_bDropped(false) {}
58 virtual HRESULT STDMETHODCALLTYPE QueryInterface(
59 /* [in] */ REFIID riid,
60 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
61 virtual ULONG STDMETHODCALLTYPE AddRef();
62 virtual ULONG STDMETHODCALLTYPE Release();
65 virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(
66 /* [in] */ BOOL fEscapePressed,
67 /* [in] */ DWORD grfKeyState);
69 virtual HRESULT STDMETHODCALLTYPE GiveFeedback(
70 /* [in] */ DWORD dwEffect);
73 ///////////////////////////////////////////////////////////////////////////////////////////////
74 class IDataObjectImpl : public IDataObject//,public IAsyncOperation
76 IDropSourceImpl* m_pDropSource;
79 StorageArray _storage;
82 IDataObjectImpl(IDropSourceImpl* pDropSource);
85 void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
88 virtual HRESULT STDMETHODCALLTYPE QueryInterface(
89 /* [in] */ REFIID riid,
90 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
91 virtual ULONG STDMETHODCALLTYPE AddRef();
92 virtual ULONG STDMETHODCALLTYPE Release();
95 virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData(
96 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,
97 /* [out] */ STGMEDIUM __RPC_FAR *pmedium);
99 virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere(
100 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
101 /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium);
103 virtual HRESULT STDMETHODCALLTYPE QueryGetData(
104 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc);
106 virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(
107 /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,
108 /* [out] */ FORMATETC __RPC_FAR *pformatetcOut);
110 virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData(
111 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
112 /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,
113 /* [in] */ BOOL fRelease);
115 virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc(
116 /* [in] */ DWORD dwDirection,
117 /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc);
119 virtual HRESULT STDMETHODCALLTYPE DAdvise(
120 /* [in] */ FORMATETC __RPC_FAR *pformatetc,
121 /* [in] */ DWORD advf,
122 /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,
123 /* [out] */ DWORD __RPC_FAR *pdwConnection);
125 virtual HRESULT STDMETHODCALLTYPE DUnadvise(
126 /* [in] */ DWORD dwConnection);
128 virtual HRESULT STDMETHODCALLTYPE EnumDAdvise(
129 /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
132 //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
133 // /* [in] */ BOOL fDoOpAsync)
138 //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
139 // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
144 //virtual HRESULT STDMETHODCALLTYPE StartOperation(
145 // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
150 //virtual HRESULT STDMETHODCALLTYPE InOperation(
151 // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
156 //virtual HRESULT STDMETHODCALLTYPE EndOperation(
157 // /* [in] */ HRESULT hResult,
158 // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
159 // /* [in] */ DWORD dwEffects)
165 ///////////////////////////////////////////////////////////////////////////////////////////////
166 class IDropTargetImpl : public IDropTarget
170 IDropTargetHelper* m_pDropTargetHelper;
172 FormatArray m_formatetc;
173 FORMATETC* m_pSupportedFrmt;
179 IDropTargetImpl(HWND m_hTargetWnd);
180 virtual ~IDropTargetImpl();
181 void AddSuportedFormat(FORMATETC& ftetc) {m_formatetc.push_back(ftetc);}
183 //return values: true - release the medium. false - don't release the medium
184 virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) = 0;
186 virtual HRESULT STDMETHODCALLTYPE QueryInterface(
187 /* [in] */ REFIID riid,
188 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
189 virtual ULONG STDMETHODCALLTYPE AddRef() {return ++m_cRefCount;}
190 virtual ULONG STDMETHODCALLTYPE Release();
192 bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect);
193 virtual HRESULT STDMETHODCALLTYPE DragEnter(
194 /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
195 /* [in] */ DWORD grfKeyState,
196 /* [in] */ POINTL pt,
197 /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
198 virtual HRESULT STDMETHODCALLTYPE DragOver(
199 /* [in] */ DWORD grfKeyState,
200 /* [in] */ POINTL pt,
201 /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
202 virtual HRESULT STDMETHODCALLTYPE DragLeave();
203 virtual HRESULT STDMETHODCALLTYPE Drop(
204 /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
205 /* [in] */ DWORD grfKeyState,
206 /* [in] */ POINTL pt,
207 /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
210 class DragSourceHelper
212 IDragSourceHelper* pDragSourceHelper;
217 if (FAILED(CoCreateInstance(CLSID_DragDropHelper,
219 CLSCTX_INPROC_SERVER,
220 IID_IDragSourceHelper,
221 (void**)&pDragSourceHelper)))
222 pDragSourceHelper = NULL;
225 virtual ~DragSourceHelper()
227 if ( pDragSourceHelper!= NULL )
229 pDragSourceHelper->Release();
230 pDragSourceHelper=NULL;
235 HRESULT InitializeFromBitmap(HBITMAP hBitmap,
236 POINT& pt, // cursor position in client coords of the window
237 RECT& rc, // selected item's bounding rect
238 IDataObject* pDataObject,
239 COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect.
242 if (pDragSourceHelper == NULL)
247 GetObject(hBitmap, sizeof(bm), &bm);
248 di.sizeDragImage.cx = bm.bmWidth;
249 di.sizeDragImage.cy = bm.bmHeight;
250 di.hbmpDragImage = hBitmap;
251 di.crColorKey = crColorKey;
252 di.ptOffset.x = pt.x - rc.left;
253 di.ptOffset.y = pt.y - rc.top;
254 return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);
257 HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)
259 if (pDragSourceHelper == NULL)
261 return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);