+++ /dev/null
-// 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 11/2000
- Modifications: replaced ATL by STL, Martin Fuchs 7/2003
-**************************************************************************/
-
-#include <vector>
-using std::vector;
-
-
-typedef vector<FORMATETC> FormatArray;
-
- /// structure containing information for one format of EnumFormatEtcImpl
-struct DataStorage {
- FORMATETC* _format;
- STGMEDIUM* _medium;
-};
-
-typedef vector<DataStorage> StorageArray;
-
-
- /// implementation of IEnumFORMATETC interface
-class EnumFormatEtcImpl
- : public IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl>, public SimpleComObject
-{
- typedef IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl> super;
-
-private:
- ULONG m_cRefCount;
- FormatArray m_pFmtEtc;
- size_t m_iCur;
-
-public:
- EnumFormatEtcImpl(const FormatArray& ArrFE);
- EnumFormatEtcImpl(const StorageArray& ArrFE);
- virtual ~EnumFormatEtcImpl() {}
-
- //IEnumFORMATETC members
- virtual HRESULT STDMETHODCALLTYPE Next(ULONG, LPFORMATETC, ULONG*);
- virtual HRESULT STDMETHODCALLTYPE Skip(ULONG);
- virtual HRESULT STDMETHODCALLTYPE Reset(void);
- virtual HRESULT STDMETHODCALLTYPE Clone(IEnumFORMATETC**);
-};
-
- /// implementation of IDropSource interface
-class IDropSourceImpl
- : public IComSrvBase<IDropSource, IDropSourceImpl>, public SimpleComObject
-{
- typedef IComSrvBase<IDropSource, IDropSourceImpl> super;
-
- long m_cRefCount;
-
-public:
- bool m_bDropped;
-
- IDropSourceImpl()
- : super(IID_IDropSource),
- m_cRefCount(0),
- m_bDropped(false)
- {
- }
-
- virtual ~IDropSourceImpl() {}
-
- //IDropSource
- virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(
- /* [in] */ BOOL fEscapePressed,
- /* [in] */ DWORD grfKeyState);
-
- virtual HRESULT STDMETHODCALLTYPE GiveFeedback(
- /* [in] */ DWORD dwEffect);
-};
-
- /// implementation of IDataObject interface
-class IDataObjectImpl
- : public IComSrvBase<IDataObject, IDataObjectImpl>, public SimpleComObject
- //public IAsyncOperation
-{
- typedef IComSrvBase<IDataObject, IDataObjectImpl> super;
-
- IDropSourceImpl* m_pDropSource;
- long m_cRefCount;
-
- StorageArray _storage;
-
-public:
- IDataObjectImpl(IDropSourceImpl* pDropSource);
- virtual ~IDataObjectImpl();
-
- void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
-
- //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;
- //}*/
-};
-
- /// implementation of IDropTarget interface
-class IDropTargetImpl : public IDropTarget
-{
- DWORD m_cRefCount;
- bool m_bAllowDrop;
- IDropTargetHelper* m_pDropTargetHelper;
-
- FormatArray m_formatetc;
- FORMATETC* m_pSupportedFrmt;
-
-protected:
- HWND m_hTargetWnd;
-
-public:
- IDropTargetImpl(HWND m_hTargetWnd);
- virtual ~IDropTargetImpl();
-
- void AddSuportedFormat(FORMATETC& ftetc) {m_formatetc.push_back(ftetc);}
-
- //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() {return ++m_cRefCount;}
- virtual ULONG STDMETHODCALLTYPE Release();
-
- 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();
- virtual HRESULT STDMETHODCALLTYPE Drop(
- /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
- /* [in] */ DWORD grfKeyState,
- /* [in] */ POINTL pt,
- /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
-};
-
- /// implementation of IDragSourceHelper interface
-class DragSourceHelper
-{
- IDragSourceHelper* pDragSourceHelper;
-
-public:
- DragSourceHelper()
- {
- if (FAILED(CoCreateInstance(CLSID_DragDropHelper,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IDragSourceHelper,
- (void**)&pDragSourceHelper)))
- pDragSourceHelper = NULL;
- }
-
- virtual ~DragSourceHelper()
- {
- if (pDragSourceHelper != NULL)
- {
- pDragSourceHelper->Release();
- pDragSourceHelper=NULL;
- }
- }
-
- // IDragSourceHelper
- HRESULT InitializeFromBitmap(HBITMAP hBitmap,
- POINT& pt, // cursor position in client coords of the window
- RECT& rc, // selected item's bounding rect
- IDataObject* pDataObject,
- COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect.
- )
- {
- if (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 pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);
- }
-
- HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)
- {
- if (pDragSourceHelper == NULL)
- return E_FAIL;
- return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);
- }
-};