1 // IDataObjectImpl.h: interface for the CIDataObjectImpl class.
\r
2 /**************************************************************************
\r
3 THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
\r
4 ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
\r
5 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
\r
7 Author: Leon Finker 1/2001
\r
8 **************************************************************************/
\r
9 #ifndef __DRAGDROPIMPL_H__
\r
10 #define __DRAGDROPIMPL_H__
\r
11 //#include <ShlDisp.h>
\r
12 ///////////////////////////////////////////////////////////////////////////////////////////////
\r
13 class CEnumFormatEtc : public IEnumFORMATETC
\r
17 CSimpleArray<FORMATETC> m_pFmtEtc;
\r
21 CEnumFormatEtc(const CSimpleArray<FORMATETC>& ArrFE);
\r
22 CEnumFormatEtc(const CSimpleArray<FORMATETC*>& ArrFE);
\r
24 STDMETHOD(QueryInterface)(REFIID, void FAR* FAR*);
\r
25 STDMETHOD_(ULONG, AddRef)(void);
\r
26 STDMETHOD_(ULONG, Release)(void);
\r
28 //IEnumFORMATETC members
\r
29 STDMETHOD(Next)(ULONG, LPFORMATETC, ULONG FAR *);
\r
30 STDMETHOD(Skip)(ULONG);
\r
31 STDMETHOD(Reset)(void);
\r
32 STDMETHOD(Clone)(IEnumFORMATETC FAR * FAR*);
\r
35 ///////////////////////////////////////////////////////////////////////////////////////////////
\r
36 class CIDropSource : public IDropSource
\r
42 CIDropSource::CIDropSource():m_cRefCount(0),m_bDropped(false) {}
\r
44 virtual HRESULT STDMETHODCALLTYPE QueryInterface(
\r
45 /* [in] */ REFIID riid,
\r
46 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
\r
47 virtual ULONG STDMETHODCALLTYPE AddRef( void);
\r
48 virtual ULONG STDMETHODCALLTYPE Release( void);
\r
50 virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(
\r
51 /* [in] */ BOOL fEscapePressed,
\r
52 /* [in] */ DWORD grfKeyState);
\r
54 virtual HRESULT STDMETHODCALLTYPE GiveFeedback(
\r
55 /* [in] */ DWORD dwEffect);
\r
58 ///////////////////////////////////////////////////////////////////////////////////////////////
\r
59 class CIDataObject : public IDataObject//,public IAsyncOperation
\r
61 CIDropSource* m_pDropSource;
\r
63 CSimpleArray<FORMATETC*> m_ArrFormatEtc;
\r
64 CSimpleArray<STGMEDIUM*> m_StgMedium;
\r
66 CIDataObject(CIDropSource* pDropSource);
\r
68 void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
\r
70 virtual HRESULT STDMETHODCALLTYPE QueryInterface(
\r
71 /* [in] */ REFIID riid,
\r
72 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
\r
73 virtual ULONG STDMETHODCALLTYPE AddRef( void);
\r
74 virtual ULONG STDMETHODCALLTYPE Release( void);
\r
77 virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData(
\r
78 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,
\r
79 /* [out] */ STGMEDIUM __RPC_FAR *pmedium);
\r
81 virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere(
\r
82 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
\r
83 /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium);
\r
85 virtual HRESULT STDMETHODCALLTYPE QueryGetData(
\r
86 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc);
\r
88 virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(
\r
89 /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,
\r
90 /* [out] */ FORMATETC __RPC_FAR *pformatetcOut);
\r
92 virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData(
\r
93 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
\r
94 /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,
\r
95 /* [in] */ BOOL fRelease);
\r
97 virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc(
\r
98 /* [in] */ DWORD dwDirection,
\r
99 /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc);
\r
101 virtual HRESULT STDMETHODCALLTYPE DAdvise(
\r
102 /* [in] */ FORMATETC __RPC_FAR *pformatetc,
\r
103 /* [in] */ DWORD advf,
\r
104 /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,
\r
105 /* [out] */ DWORD __RPC_FAR *pdwConnection);
\r
107 virtual HRESULT STDMETHODCALLTYPE DUnadvise(
\r
108 /* [in] */ DWORD dwConnection);
\r
110 virtual HRESULT STDMETHODCALLTYPE EnumDAdvise(
\r
111 /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
\r
114 //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
\r
115 // /* [in] */ BOOL fDoOpAsync)
\r
117 // return E_NOTIMPL;
\r
120 //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
\r
121 // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
\r
123 // return E_NOTIMPL;
\r
126 //virtual HRESULT STDMETHODCALLTYPE StartOperation(
\r
127 // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
\r
129 // return E_NOTIMPL;
\r
132 //virtual HRESULT STDMETHODCALLTYPE InOperation(
\r
133 // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
\r
135 // return E_NOTIMPL;
\r
138 //virtual HRESULT STDMETHODCALLTYPE EndOperation(
\r
139 // /* [in] */ HRESULT hResult,
\r
140 // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
\r
141 // /* [in] */ DWORD dwEffects)
\r
143 // return E_NOTIMPL;
\r
147 ///////////////////////////////////////////////////////////////////////////////////////////////
\r
148 class CIDropTarget : public IDropTarget
\r
152 struct IDropTargetHelper *m_pDropTargetHelper;
\r
153 CSimpleArray<FORMATETC> m_formatetc;
\r
154 FORMATETC* m_pSupportedFrmt;
\r
159 CIDropTarget(HWND m_hTargetWnd);
\r
160 virtual ~CIDropTarget();
\r
161 void AddSuportedFormat(FORMATETC& ftetc) { m_formatetc.Add(ftetc); }
\r
163 //return values: true - release the medium. false - don't release the medium
\r
164 virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium,DWORD *pdwEffect, POINTL pt) = 0;
\r
166 virtual HRESULT STDMETHODCALLTYPE QueryInterface(
\r
167 /* [in] */ REFIID riid,
\r
168 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
\r
169 virtual ULONG STDMETHODCALLTYPE AddRef( void) { ATLTRACE("CIDropTarget::AddRef\n"); return ++m_cRefCount; }
\r
170 virtual ULONG STDMETHODCALLTYPE Release( void);
\r
172 bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect);
\r
173 virtual HRESULT STDMETHODCALLTYPE DragEnter(
\r
174 /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
\r
175 /* [in] */ DWORD grfKeyState,
\r
176 /* [in] */ POINTL pt,
\r
177 /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
\r
178 virtual HRESULT STDMETHODCALLTYPE DragOver(
\r
179 /* [in] */ DWORD grfKeyState,
\r
180 /* [in] */ POINTL pt,
\r
181 /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
\r
182 virtual HRESULT STDMETHODCALLTYPE DragLeave( void);
\r
183 virtual HRESULT STDMETHODCALLTYPE Drop(
\r
184 /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
\r
185 /* [in] */ DWORD grfKeyState,
\r
186 /* [in] */ POINTL pt,
\r
187 /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
\r
190 class CDragSourceHelper
\r
192 IDragSourceHelper* pDragSourceHelper;
\r
194 CDragSourceHelper()
\r
196 pDragSourceHelper = NULL;
\r
197 if(FAILED(CoCreateInstance(CLSID_DragDropHelper,
\r
199 CLSCTX_INPROC_SERVER,
\r
200 IID_IDragSourceHelper,
\r
201 (void**)&pDragSourceHelper)))
\r
202 pDragSourceHelper = NULL;
\r
204 virtual ~CDragSourceHelper()
\r
206 if( pDragSourceHelper!= NULL )
\r
208 pDragSourceHelper->Release();
\r
209 pDragSourceHelper=NULL;
\r
213 // IDragSourceHelper
\r
214 HRESULT InitializeFromBitmap(HBITMAP hBitmap,
\r
215 POINT& pt, // cursor position in client coords of the window
\r
216 RECT& rc, // selected item's bounding rect
\r
217 IDataObject* pDataObject,
\r
218 COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect.
\r
221 if(pDragSourceHelper == NULL)
\r
226 GetObject(hBitmap, sizeof(bm), &bm);
\r
227 di.sizeDragImage.cx = bm.bmWidth;
\r
228 di.sizeDragImage.cy = bm.bmHeight;
\r
229 di.hbmpDragImage = hBitmap;
\r
230 di.crColorKey = crColorKey;
\r
231 di.ptOffset.x = pt.x - rc.left;
\r
232 di.ptOffset.y = pt.y - rc.top;
\r
233 return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);
\r
235 HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)
\r
237 if(pDragSourceHelper == NULL)
\r
239 return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);
\r
242 #endif //__DRAGDROPIMPL_H__