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
;
17 /// structure containing information for one format of EnumFormatEtcImpl
23 typedef vector
<DataStorage
> StorageArray
;
26 /// implementation of IEnumFORMATETC interface
27 class EnumFormatEtcImpl
: public IEnumFORMATETC
31 FormatArray m_pFmtEtc
;
35 EnumFormatEtcImpl(const FormatArray
& ArrFE
);
36 EnumFormatEtcImpl(const StorageArray
& ArrFE
);
37 virtual ~EnumFormatEtcImpl() {}
40 virtual HRESULT STDMETHODCALLTYPE
QueryInterface(REFIID
, void**);
41 virtual ULONG STDMETHODCALLTYPE
AddRef(void);
42 virtual ULONG STDMETHODCALLTYPE
Release(void);
44 //IEnumFORMATETC members
45 virtual HRESULT STDMETHODCALLTYPE
Next(ULONG
, LPFORMATETC
, ULONG
*);
46 virtual HRESULT STDMETHODCALLTYPE
Skip(ULONG
);
47 virtual HRESULT STDMETHODCALLTYPE
Reset(void);
48 virtual HRESULT STDMETHODCALLTYPE
Clone(IEnumFORMATETC
**);
51 /// implementation of IDropSource interface
52 class IDropSourceImpl
: public IDropSource
59 IDropSourceImpl::IDropSourceImpl() : m_cRefCount(0), m_bDropped(false) {}
60 virtual ~IDropSourceImpl() {}
63 virtual HRESULT STDMETHODCALLTYPE
QueryInterface(
64 /* [in] */ REFIID riid
,
65 /* [iid_is][out] */ void __RPC_FAR
*__RPC_FAR
*ppvObject
);
66 virtual ULONG STDMETHODCALLTYPE
AddRef();
67 virtual ULONG STDMETHODCALLTYPE
Release();
70 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(
71 /* [in] */ BOOL fEscapePressed
,
72 /* [in] */ DWORD grfKeyState
);
74 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(
75 /* [in] */ DWORD dwEffect
);
78 /// implementation of IDataObject interface
79 class IDataObjectImpl
: public IDataObject
//,public IAsyncOperation
81 IDropSourceImpl
* m_pDropSource
;
84 StorageArray _storage
;
87 IDataObjectImpl(IDropSourceImpl
* pDropSource
);
88 virtual ~IDataObjectImpl();
90 void CopyMedium(STGMEDIUM
* pMedDest
, STGMEDIUM
* pMedSrc
, FORMATETC
* pFmtSrc
);
93 virtual HRESULT STDMETHODCALLTYPE
QueryInterface(
94 /* [in] */ REFIID riid
,
95 /* [iid_is][out] */ void __RPC_FAR
*__RPC_FAR
*ppvObject
);
96 virtual ULONG STDMETHODCALLTYPE
AddRef();
97 virtual ULONG STDMETHODCALLTYPE
Release();
100 virtual /* [local] */ HRESULT STDMETHODCALLTYPE
GetData(
101 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatetcIn
,
102 /* [out] */ STGMEDIUM __RPC_FAR
*pmedium
);
104 virtual /* [local] */ HRESULT STDMETHODCALLTYPE
GetDataHere(
105 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatetc
,
106 /* [out][in] */ STGMEDIUM __RPC_FAR
*pmedium
);
108 virtual HRESULT STDMETHODCALLTYPE
QueryGetData(
109 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatetc
);
111 virtual HRESULT STDMETHODCALLTYPE
GetCanonicalFormatEtc(
112 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatectIn
,
113 /* [out] */ FORMATETC __RPC_FAR
*pformatetcOut
);
115 virtual /* [local] */ HRESULT STDMETHODCALLTYPE
SetData(
116 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatetc
,
117 /* [unique][in] */ STGMEDIUM __RPC_FAR
*pmedium
,
118 /* [in] */ BOOL fRelease
);
120 virtual HRESULT STDMETHODCALLTYPE
EnumFormatEtc(
121 /* [in] */ DWORD dwDirection
,
122 /* [out] */ IEnumFORMATETC __RPC_FAR
*__RPC_FAR
*ppenumFormatEtc
);
124 virtual HRESULT STDMETHODCALLTYPE
DAdvise(
125 /* [in] */ FORMATETC __RPC_FAR
*pformatetc
,
126 /* [in] */ DWORD advf
,
127 /* [unique][in] */ IAdviseSink __RPC_FAR
*pAdvSink
,
128 /* [out] */ DWORD __RPC_FAR
*pdwConnection
);
130 virtual HRESULT STDMETHODCALLTYPE
DUnadvise(
131 /* [in] */ DWORD dwConnection
);
133 virtual HRESULT STDMETHODCALLTYPE
EnumDAdvise(
134 /* [out] */ IEnumSTATDATA __RPC_FAR
*__RPC_FAR
*ppenumAdvise
);
137 //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
138 // /* [in] */ BOOL fDoOpAsync)
143 //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
144 // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
149 //virtual HRESULT STDMETHODCALLTYPE StartOperation(
150 // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
155 //virtual HRESULT STDMETHODCALLTYPE InOperation(
156 // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
161 //virtual HRESULT STDMETHODCALLTYPE EndOperation(
162 // /* [in] */ HRESULT hResult,
163 // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
164 // /* [in] */ DWORD dwEffects)
170 /// implementation of IDropTarget interface
171 class IDropTargetImpl
: public IDropTarget
175 IDropTargetHelper
* m_pDropTargetHelper
;
177 FormatArray m_formatetc
;
178 FORMATETC
* m_pSupportedFrmt
;
184 IDropTargetImpl(HWND m_hTargetWnd
);
185 virtual ~IDropTargetImpl();
187 void AddSuportedFormat(FORMATETC
& ftetc
) {m_formatetc
.push_back(ftetc
);}
189 //return values: true - release the medium. false - don't release the medium
190 virtual bool OnDrop(FORMATETC
* pFmtEtc
, STGMEDIUM
& medium
, DWORD
*pdwEffect
) = 0;
192 virtual HRESULT STDMETHODCALLTYPE
QueryInterface(
193 /* [in] */ REFIID riid
,
194 /* [iid_is][out] */ void __RPC_FAR
*__RPC_FAR
*ppvObject
);
195 virtual ULONG STDMETHODCALLTYPE
AddRef() {return ++m_cRefCount
;}
196 virtual ULONG STDMETHODCALLTYPE
Release();
198 bool QueryDrop(DWORD grfKeyState
, LPDWORD pdwEffect
);
199 virtual HRESULT STDMETHODCALLTYPE
DragEnter(
200 /* [unique][in] */ IDataObject __RPC_FAR
*pDataObj
,
201 /* [in] */ DWORD grfKeyState
,
202 /* [in] */ POINTL pt
,
203 /* [out][in] */ DWORD __RPC_FAR
*pdwEffect
);
204 virtual HRESULT STDMETHODCALLTYPE
DragOver(
205 /* [in] */ DWORD grfKeyState
,
206 /* [in] */ POINTL pt
,
207 /* [out][in] */ DWORD __RPC_FAR
*pdwEffect
);
208 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
209 virtual HRESULT STDMETHODCALLTYPE
Drop(
210 /* [unique][in] */ IDataObject __RPC_FAR
*pDataObj
,
211 /* [in] */ DWORD grfKeyState
,
212 /* [in] */ POINTL pt
,
213 /* [out][in] */ DWORD __RPC_FAR
*pdwEffect
);
216 /// implementation of IDragSourceHelper interface
217 class DragSourceHelper
219 IDragSourceHelper
* pDragSourceHelper
;
224 if (FAILED(CoCreateInstance(CLSID_DragDropHelper
,
226 CLSCTX_INPROC_SERVER
,
227 IID_IDragSourceHelper
,
228 (void**)&pDragSourceHelper
)))
229 pDragSourceHelper
= NULL
;
232 virtual ~DragSourceHelper()
234 if (pDragSourceHelper
!= NULL
)
236 pDragSourceHelper
->Release();
237 pDragSourceHelper
=NULL
;
242 HRESULT
InitializeFromBitmap(HBITMAP hBitmap
,
243 POINT
& pt
, // cursor position in client coords of the window
244 RECT
& rc
, // selected item's bounding rect
245 IDataObject
* pDataObject
,
246 COLORREF crColorKey
=GetSysColor(COLOR_WINDOW
)// color of the window used for transparent effect.
249 if (pDragSourceHelper
== NULL
)
254 GetObject(hBitmap
, sizeof(bm
), &bm
);
255 di
.sizeDragImage
.cx
= bm
.bmWidth
;
256 di
.sizeDragImage
.cy
= bm
.bmHeight
;
257 di
.hbmpDragImage
= hBitmap
;
258 di
.crColorKey
= crColorKey
;
259 di
.ptOffset
.x
= pt
.x
- rc
.left
;
260 di
.ptOffset
.y
= pt
.y
- rc
.top
;
261 return pDragSourceHelper
->InitializeFromBitmap(&di
, pDataObject
);
264 HRESULT
InitializeFromWindow(HWND hwnd
, POINT
& pt
,IDataObject
* pDataObject
)
266 if (pDragSourceHelper
== NULL
)
268 return pDragSourceHelper
->InitializeFromWindow(hwnd
, &pt
, pDataObject
);