123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- // IDataObjectImpl.h: interface for the CIDataObjectImpl class.
- /**************************************************************************
- THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
- ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
- PARTICULAR PURPOSE.
- Author: Leon Finker 1/2001
- **************************************************************************/
- #ifndef __DRAGDROPIMPL_H__
- #define __DRAGDROPIMPL_H__
- #include <shlobj.h>
- #include <vector>
- namespace DuiLib {
- ////////////////////////////////////////////////////////////////////////////////
- ///
- typedef std::vector<FORMATETC> FormatEtcArray;
- typedef std::vector<FORMATETC*> PFormatEtcArray;
- typedef std::vector<STGMEDIUM*> PStgMediumArray;
-
- ////////////////////////////////////////////////////////////////////////////////
- ///
- class UILIB_API CEnumFormatEtc : public IEnumFORMATETC
- {
- private:
- ULONG m_cRefCount;
- FormatEtcArray m_pFmtEtc;
- int m_iCur;
- public:
- CEnumFormatEtc(const FormatEtcArray& ArrFE);
- CEnumFormatEtc(const PFormatEtcArray& ArrFE);
- //IUnknown members
- STDMETHOD(QueryInterface)(REFIID, void FAR* FAR*);
- STDMETHOD_(ULONG, AddRef)(void);
- STDMETHOD_(ULONG, Release)(void);
- //IEnumFORMATETC members
- STDMETHOD(Next)(ULONG, LPFORMATETC, ULONG FAR *);
- STDMETHOD(Skip)(ULONG);
- STDMETHOD(Reset)(void);
- STDMETHOD(Clone)(IEnumFORMATETC FAR * FAR*);
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- ///
- class UILIB_API CIDropSource : public IDropSource
- {
- long m_cRefCount;
- public:
- bool m_bDropped;
- CIDropSource():m_cRefCount(0),m_bDropped(false) {}
- //IUnknown
- virtual HRESULT STDMETHODCALLTYPE QueryInterface(
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
- virtual ULONG STDMETHODCALLTYPE AddRef( void);
- virtual ULONG STDMETHODCALLTYPE Release( void);
- //IDropSource
- virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(
- /* [in] */ BOOL fEscapePressed,
- /* [in] */ DWORD grfKeyState);
- virtual HRESULT STDMETHODCALLTYPE GiveFeedback(
- /* [in] */ DWORD dwEffect);
- };
-
- ////////////////////////////////////////////////////////////////////////////////
- ///
- class UILIB_API CIDataObject : public IDataObject//,public IAsyncOperation
- {
- CIDropSource* m_pDropSource;
- long m_cRefCount;
- PFormatEtcArray m_ArrFormatEtc;
- PStgMediumArray m_StgMedium;
- public:
- CIDataObject(CIDropSource* pDropSource);
- ~CIDataObject();
- void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
- //IUnknown
- virtual HRESULT STDMETHODCALLTYPE QueryInterface(
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
- virtual ULONG STDMETHODCALLTYPE AddRef( void);
- virtual ULONG STDMETHODCALLTYPE Release( void);
- //IDataObject
- virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData(
- /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,
- /* [out] */ STGMEDIUM __RPC_FAR *pmedium);
- virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere(
- /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
- /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium);
- virtual HRESULT STDMETHODCALLTYPE QueryGetData(
- /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc);
- virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(
- /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,
- /* [out] */ FORMATETC __RPC_FAR *pformatetcOut);
- virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData(
- /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
- /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,
- /* [in] */ BOOL fRelease);
- virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc(
- /* [in] */ DWORD dwDirection,
- /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc);
- virtual HRESULT STDMETHODCALLTYPE DAdvise(
- /* [in] */ FORMATETC __RPC_FAR *pformatetc,
- /* [in] */ DWORD advf,
- /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,
- /* [out] */ DWORD __RPC_FAR *pdwConnection);
- virtual HRESULT STDMETHODCALLTYPE DUnadvise(
- /* [in] */ DWORD dwConnection);
- virtual HRESULT STDMETHODCALLTYPE EnumDAdvise(
- /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
- //IAsyncOperation
- //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
- // /* [in] */ BOOL fDoOpAsync)
- //{
- // return E_NOTIMPL;
- //}
- //
- //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
- // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
- //{
- // return E_NOTIMPL;
- //}
- //
- //virtual HRESULT STDMETHODCALLTYPE StartOperation(
- // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
- //{
- // return E_NOTIMPL;
- //}
- //
- //virtual HRESULT STDMETHODCALLTYPE InOperation(
- // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
- //{
- // return E_NOTIMPL;
- //}
- //
- //virtual HRESULT STDMETHODCALLTYPE EndOperation(
- // /* [in] */ HRESULT hResult,
- // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
- // /* [in] */ DWORD dwEffects)
- //{
- // return E_NOTIMPL;
- //}
- };
- ////////////////////////////////////////////////////////////////////////////////
- ///
- class UILIB_API CIDropTarget : public IDropTarget
- {
- public:
- CIDropTarget();
- virtual ~CIDropTarget();
- public:
- void SetTargetWnd(HWND hWnd) { m_hTargetWnd = hWnd; }
- void AddSuportedFormat(FORMATETC& ftetc) { m_formatetc.push_back(ftetc); }
-
- public:
- //return values: true - release the medium. false - don't release the medium
- virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium,DWORD *pdwEffect) = 0;
- virtual HRESULT STDMETHODCALLTYPE QueryInterface(
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
- virtual ULONG STDMETHODCALLTYPE AddRef( void) { return ++m_cRefCount; }
- virtual ULONG STDMETHODCALLTYPE Release( void);
- bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect);
- virtual HRESULT STDMETHODCALLTYPE DragEnter(
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
- virtual HRESULT STDMETHODCALLTYPE DragOver(
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
- virtual HRESULT STDMETHODCALLTYPE DragLeave( void);
- virtual HRESULT STDMETHODCALLTYPE Drop(
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
- protected:
- HWND m_hTargetWnd;
- private:
- DWORD m_cRefCount;
- bool m_bAllowDrop;
- struct IDropTargetHelper *m_pDropTargetHelper;
- FormatEtcArray m_formatetc;
- FORMATETC* m_pSupportedFrmt;
- };
- ////////////////////////////////////////////////////////////////////////////////
- ///
- class UILIB_API CDragSourceHelper
- {
- public:
- CDragSourceHelper()
- {
- m_pDragSourceHelper = NULL;
- CoCreateInstance(CLSID_DragDropHelper, NULL, CLSCTX_INPROC_SERVER, IID_IDragSourceHelper, (void**)&m_pDragSourceHelper);
- }
- virtual ~CDragSourceHelper()
- {
- if( m_pDragSourceHelper!= NULL ) {
- m_pDragSourceHelper->Release();
- m_pDragSourceHelper=NULL;
- }
- }
- public:
- // IDragSourceHelper
- HRESULT InitializeFromBitmap(HBITMAP hBitmap, POINT& pt, RECT& rc, IDataObject* pDataObject, COLORREF crColorKey = GetSysColor(COLOR_WINDOW))
- {
- if(m_pDragSourceHelper == NULL) {
- return E_FAIL;
- }
- SHDRAGIMAGE di;
- BITMAP bm;
- GetObject(hBitmap, sizeof(bm), &bm);
- di.sizeDragImage.cx = bm.bmWidth;
- di.sizeDragImage.cy = bm.bmHeight;
- di.hbmpDragImage = hBitmap;
- di.crColorKey = crColorKey;
- di.ptOffset.x = pt.x - rc.left;
- di.ptOffset.y = pt.y - rc.top;
- return m_pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);
- }
- HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)
- {
- if(m_pDragSourceHelper == NULL) {
- return E_FAIL;
- }
- return m_pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);
- }
-
- private:
- IDragSourceHelper* m_pDragSourceHelper;
- };
- }
- #endif //__DRAGDROPIMPL_H__
|