DragDropImpl.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 1/2001
  8. **************************************************************************/
  9. #ifndef __DRAGDROPIMPL_H__
  10. #define __DRAGDROPIMPL_H__
  11. #include <shlobj.h>
  12. #include <vector>
  13. namespace DuiLib {
  14. ////////////////////////////////////////////////////////////////////////////////
  15. ///
  16. typedef std::vector<FORMATETC> FormatEtcArray;
  17. typedef std::vector<FORMATETC*> PFormatEtcArray;
  18. typedef std::vector<STGMEDIUM*> PStgMediumArray;
  19. ////////////////////////////////////////////////////////////////////////////////
  20. ///
  21. class UILIB_API CEnumFormatEtc : public IEnumFORMATETC
  22. {
  23. private:
  24. ULONG m_cRefCount;
  25. FormatEtcArray m_pFmtEtc;
  26. int m_iCur;
  27. public:
  28. CEnumFormatEtc(const FormatEtcArray& ArrFE);
  29. CEnumFormatEtc(const PFormatEtcArray& ArrFE);
  30. //IUnknown members
  31. STDMETHOD(QueryInterface)(REFIID, void FAR* FAR*);
  32. STDMETHOD_(ULONG, AddRef)(void);
  33. STDMETHOD_(ULONG, Release)(void);
  34. //IEnumFORMATETC members
  35. STDMETHOD(Next)(ULONG, LPFORMATETC, ULONG FAR *);
  36. STDMETHOD(Skip)(ULONG);
  37. STDMETHOD(Reset)(void);
  38. STDMETHOD(Clone)(IEnumFORMATETC FAR * FAR*);
  39. };
  40. ////////////////////////////////////////////////////////////////////////////////
  41. ///
  42. class UILIB_API CIDropSource : public IDropSource
  43. {
  44. long m_cRefCount;
  45. public:
  46. bool m_bDropped;
  47. CIDropSource():m_cRefCount(0),m_bDropped(false) {}
  48. //IUnknown
  49. virtual HRESULT STDMETHODCALLTYPE QueryInterface(
  50. /* [in] */ REFIID riid,
  51. /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
  52. virtual ULONG STDMETHODCALLTYPE AddRef( void);
  53. virtual ULONG STDMETHODCALLTYPE Release( void);
  54. //IDropSource
  55. virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(
  56. /* [in] */ BOOL fEscapePressed,
  57. /* [in] */ DWORD grfKeyState);
  58. virtual HRESULT STDMETHODCALLTYPE GiveFeedback(
  59. /* [in] */ DWORD dwEffect);
  60. };
  61. ////////////////////////////////////////////////////////////////////////////////
  62. ///
  63. class UILIB_API CIDataObject : public IDataObject//,public IAsyncOperation
  64. {
  65. CIDropSource* m_pDropSource;
  66. long m_cRefCount;
  67. PFormatEtcArray m_ArrFormatEtc;
  68. PStgMediumArray m_StgMedium;
  69. public:
  70. CIDataObject(CIDropSource* pDropSource);
  71. ~CIDataObject();
  72. void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
  73. //IUnknown
  74. virtual HRESULT STDMETHODCALLTYPE QueryInterface(
  75. /* [in] */ REFIID riid,
  76. /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
  77. virtual ULONG STDMETHODCALLTYPE AddRef( void);
  78. virtual ULONG STDMETHODCALLTYPE Release( void);
  79. //IDataObject
  80. virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData(
  81. /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,
  82. /* [out] */ STGMEDIUM __RPC_FAR *pmedium);
  83. virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere(
  84. /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
  85. /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium);
  86. virtual HRESULT STDMETHODCALLTYPE QueryGetData(
  87. /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc);
  88. virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(
  89. /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,
  90. /* [out] */ FORMATETC __RPC_FAR *pformatetcOut);
  91. virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData(
  92. /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
  93. /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,
  94. /* [in] */ BOOL fRelease);
  95. virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc(
  96. /* [in] */ DWORD dwDirection,
  97. /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc);
  98. virtual HRESULT STDMETHODCALLTYPE DAdvise(
  99. /* [in] */ FORMATETC __RPC_FAR *pformatetc,
  100. /* [in] */ DWORD advf,
  101. /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,
  102. /* [out] */ DWORD __RPC_FAR *pdwConnection);
  103. virtual HRESULT STDMETHODCALLTYPE DUnadvise(
  104. /* [in] */ DWORD dwConnection);
  105. virtual HRESULT STDMETHODCALLTYPE EnumDAdvise(
  106. /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
  107. //IAsyncOperation
  108. //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
  109. // /* [in] */ BOOL fDoOpAsync)
  110. //{
  111. // return E_NOTIMPL;
  112. //}
  113. //
  114. //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
  115. // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
  116. //{
  117. // return E_NOTIMPL;
  118. //}
  119. //
  120. //virtual HRESULT STDMETHODCALLTYPE StartOperation(
  121. // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
  122. //{
  123. // return E_NOTIMPL;
  124. //}
  125. //
  126. //virtual HRESULT STDMETHODCALLTYPE InOperation(
  127. // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
  128. //{
  129. // return E_NOTIMPL;
  130. //}
  131. //
  132. //virtual HRESULT STDMETHODCALLTYPE EndOperation(
  133. // /* [in] */ HRESULT hResult,
  134. // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
  135. // /* [in] */ DWORD dwEffects)
  136. //{
  137. // return E_NOTIMPL;
  138. //}
  139. };
  140. ////////////////////////////////////////////////////////////////////////////////
  141. ///
  142. class UILIB_API CIDropTarget : public IDropTarget
  143. {
  144. public:
  145. CIDropTarget();
  146. virtual ~CIDropTarget();
  147. public:
  148. void SetTargetWnd(HWND hWnd) { m_hTargetWnd = hWnd; }
  149. void AddSuportedFormat(FORMATETC& ftetc) { m_formatetc.push_back(ftetc); }
  150. public:
  151. //return values: true - release the medium. false - don't release the medium
  152. virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium,DWORD *pdwEffect) = 0;
  153. virtual HRESULT STDMETHODCALLTYPE QueryInterface(
  154. /* [in] */ REFIID riid,
  155. /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
  156. virtual ULONG STDMETHODCALLTYPE AddRef( void) { return ++m_cRefCount; }
  157. virtual ULONG STDMETHODCALLTYPE Release( void);
  158. bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect);
  159. virtual HRESULT STDMETHODCALLTYPE DragEnter(
  160. /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
  161. /* [in] */ DWORD grfKeyState,
  162. /* [in] */ POINTL pt,
  163. /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
  164. virtual HRESULT STDMETHODCALLTYPE DragOver(
  165. /* [in] */ DWORD grfKeyState,
  166. /* [in] */ POINTL pt,
  167. /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
  168. virtual HRESULT STDMETHODCALLTYPE DragLeave( void);
  169. virtual HRESULT STDMETHODCALLTYPE Drop(
  170. /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
  171. /* [in] */ DWORD grfKeyState,
  172. /* [in] */ POINTL pt,
  173. /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
  174. protected:
  175. HWND m_hTargetWnd;
  176. private:
  177. DWORD m_cRefCount;
  178. bool m_bAllowDrop;
  179. struct IDropTargetHelper *m_pDropTargetHelper;
  180. FormatEtcArray m_formatetc;
  181. FORMATETC* m_pSupportedFrmt;
  182. };
  183. ////////////////////////////////////////////////////////////////////////////////
  184. ///
  185. class UILIB_API CDragSourceHelper
  186. {
  187. public:
  188. CDragSourceHelper()
  189. {
  190. m_pDragSourceHelper = NULL;
  191. CoCreateInstance(CLSID_DragDropHelper, NULL, CLSCTX_INPROC_SERVER, IID_IDragSourceHelper, (void**)&m_pDragSourceHelper);
  192. }
  193. virtual ~CDragSourceHelper()
  194. {
  195. if( m_pDragSourceHelper!= NULL ) {
  196. m_pDragSourceHelper->Release();
  197. m_pDragSourceHelper=NULL;
  198. }
  199. }
  200. public:
  201. // IDragSourceHelper
  202. HRESULT InitializeFromBitmap(HBITMAP hBitmap, POINT& pt, RECT& rc, IDataObject* pDataObject, COLORREF crColorKey = GetSysColor(COLOR_WINDOW))
  203. {
  204. if(m_pDragSourceHelper == NULL) {
  205. return E_FAIL;
  206. }
  207. SHDRAGIMAGE di;
  208. BITMAP bm;
  209. GetObject(hBitmap, sizeof(bm), &bm);
  210. di.sizeDragImage.cx = bm.bmWidth;
  211. di.sizeDragImage.cy = bm.bmHeight;
  212. di.hbmpDragImage = hBitmap;
  213. di.crColorKey = crColorKey;
  214. di.ptOffset.x = pt.x - rc.left;
  215. di.ptOffset.y = pt.y - rc.top;
  216. return m_pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);
  217. }
  218. HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)
  219. {
  220. if(m_pDragSourceHelper == NULL) {
  221. return E_FAIL;
  222. }
  223. return m_pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);
  224. }
  225. private:
  226. IDragSourceHelper* m_pDragSourceHelper;
  227. };
  228. }
  229. #endif //__DRAGDROPIMPL_H__