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
28 : public IComSrvBase
<IEnumFORMATETC
, EnumFormatEtcImpl
>, public SimpleComObject
30 typedef IComSrvBase
<IEnumFORMATETC
, EnumFormatEtcImpl
> super
;
34 FormatArray m_pFmtEtc
;
38 EnumFormatEtcImpl(const FormatArray
& ArrFE
);
39 EnumFormatEtcImpl(const StorageArray
& ArrFE
);
40 virtual ~EnumFormatEtcImpl() {}
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
**);
49 /// implementation of IDropSource interface
51 : public IComSrvBase
<IDropSource
, IDropSourceImpl
>, public SimpleComObject
53 typedef IComSrvBase
<IDropSource
, IDropSourceImpl
> super
;
61 : super(IID_IDropSource
),
67 virtual ~IDropSourceImpl() {}
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
80 : public IComSrvBase
<IDataObject
, IDataObjectImpl
>, public SimpleComObject
81 //public IAsyncOperation
83 typedef IComSrvBase
<IDataObject
, IDataObjectImpl
> super
;
85 IDropSourceImpl
* m_pDropSource
;
88 StorageArray _storage
;
91 IDataObjectImpl(IDropSourceImpl
* pDropSource
);
92 virtual ~IDataObjectImpl();
94 void CopyMedium(STGMEDIUM
* pMedDest
, STGMEDIUM
* pMedSrc
, FORMATETC
* pFmtSrc
);
97 virtual /* [local] */ HRESULT STDMETHODCALLTYPE
GetData(
98 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatetcIn
,
99 /* [out] */ STGMEDIUM __RPC_FAR
*pmedium
);
101 virtual /* [local] */ HRESULT STDMETHODCALLTYPE
GetDataHere(
102 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatetc
,
103 /* [out][in] */ STGMEDIUM __RPC_FAR
*pmedium
);
105 virtual HRESULT STDMETHODCALLTYPE
QueryGetData(
106 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatetc
);
108 virtual HRESULT STDMETHODCALLTYPE
GetCanonicalFormatEtc(
109 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatectIn
,
110 /* [out] */ FORMATETC __RPC_FAR
*pformatetcOut
);
112 virtual /* [local] */ HRESULT STDMETHODCALLTYPE
SetData(
113 /* [unique][in] */ FORMATETC __RPC_FAR
*pformatetc
,
114 /* [unique][in] */ STGMEDIUM __RPC_FAR
*pmedium
,
115 /* [in] */ BOOL fRelease
);
117 virtual HRESULT STDMETHODCALLTYPE
EnumFormatEtc(
118 /* [in] */ DWORD dwDirection
,
119 /* [out] */ IEnumFORMATETC __RPC_FAR
*__RPC_FAR
*ppenumFormatEtc
);
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
);
127 virtual HRESULT STDMETHODCALLTYPE
DUnadvise(
128 /* [in] */ DWORD dwConnection
);
130 virtual HRESULT STDMETHODCALLTYPE
EnumDAdvise(
131 /* [out] */ IEnumSTATDATA __RPC_FAR
*__RPC_FAR
*ppenumAdvise
);
134 //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
135 // /* [in] */ BOOL fDoOpAsync)
140 //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
141 // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
146 //virtual HRESULT STDMETHODCALLTYPE StartOperation(
147 // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
152 //virtual HRESULT STDMETHODCALLTYPE InOperation(
153 // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
158 //virtual HRESULT STDMETHODCALLTYPE EndOperation(
159 // /* [in] */ HRESULT hResult,
160 // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
161 // /* [in] */ DWORD dwEffects)
167 /// implementation of IDropTarget interface
168 class IDropTargetImpl
: public IDropTarget
172 IDropTargetHelper
* m_pDropTargetHelper
;
174 FormatArray m_formatetc
;
175 FORMATETC
* m_pSupportedFrmt
;
181 IDropTargetImpl(HWND m_hTargetWnd
);
182 virtual ~IDropTargetImpl();
184 void AddSuportedFormat(FORMATETC
& ftetc
) {m_formatetc
.push_back(ftetc
);}
186 //return values: true - release the medium. false - don't release the medium
187 virtual bool OnDrop(FORMATETC
* pFmtEtc
, STGMEDIUM
& medium
, DWORD
*pdwEffect
) = 0;
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();
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
);
213 /// implementation of IDragSourceHelper interface
214 class DragSourceHelper
216 IDragSourceHelper
* pDragSourceHelper
;
221 if (FAILED(CoCreateInstance(CLSID_DragDropHelper
,
223 CLSCTX_INPROC_SERVER
,
224 IID_IDragSourceHelper
,
225 (void**)&pDragSourceHelper
)))
226 pDragSourceHelper
= NULL
;
229 virtual ~DragSourceHelper()
231 if (pDragSourceHelper
!= NULL
)
233 pDragSourceHelper
->Release();
234 pDragSourceHelper
=NULL
;
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.
246 if (pDragSourceHelper
== NULL
)
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
);
261 HRESULT
InitializeFromWindow(HWND hwnd
, POINT
& pt
,IDataObject
* pDataObject
)
263 if (pDragSourceHelper
== NULL
)
265 return pDragSourceHelper
->InitializeFromWindow(hwnd
, &pt
, pDataObject
);