00001 // IDataObjectImpl.h: interface for the CIDataObjectImpl class. 00002 /************************************************************************** 00003 THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF 00004 ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 00005 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 00006 PARTICULAR PURPOSE. 00007 Author: Leon Finker 11/2000 00008 Modifications: replaced ATL by STL, Martin Fuchs 7/2003 00009 **************************************************************************/ 00010 00011 #include <vector> 00012 using std::vector; 00013 00014 00015 typedef vector<FORMATETC> FormatArray; 00016 00017 /// structure containing information for one format of EnumFormatEtcImpl 00018 struct DataStorage { 00019 FORMATETC* _format; 00020 STGMEDIUM* _medium; 00021 }; 00022 00023 typedef vector<DataStorage> StorageArray; 00024 00025 00026 /// implementation of IEnumFORMATETC interface 00027 class EnumFormatEtcImpl 00028 : public IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl>, public SimpleComObject 00029 { 00030 typedef IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl> super; 00031 00032 private: 00033 ULONG m_cRefCount; 00034 FormatArray m_pFmtEtc; 00035 size_t m_iCur; 00036 00037 public: 00038 EnumFormatEtcImpl(const FormatArray& ArrFE); 00039 EnumFormatEtcImpl(const StorageArray& ArrFE); 00040 virtual ~EnumFormatEtcImpl() {} 00041 00042 //IEnumFORMATETC members 00043 virtual HRESULT STDMETHODCALLTYPE Next(ULONG, LPFORMATETC, ULONG*); 00044 virtual HRESULT STDMETHODCALLTYPE Skip(ULONG); 00045 virtual HRESULT STDMETHODCALLTYPE Reset(void); 00046 virtual HRESULT STDMETHODCALLTYPE Clone(IEnumFORMATETC**); 00047 }; 00048 00049 /// implementation of IDropSource interface 00050 class IDropSourceImpl 00051 : public IComSrvBase<IDropSource, IDropSourceImpl>, public SimpleComObject 00052 { 00053 typedef IComSrvBase<IDropSource, IDropSourceImpl> super; 00054 00055 long m_cRefCount; 00056 00057 public: 00058 bool m_bDropped; 00059 00060 IDropSourceImpl() 00061 : super(IID_IDropSource), 00062 m_cRefCount(0), 00063 m_bDropped(false) 00064 { 00065 } 00066 00067 virtual ~IDropSourceImpl() {} 00068 00069 //IDropSource 00070 virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag( 00071 /* [in] */ BOOL fEscapePressed, 00072 /* [in] */ DWORD grfKeyState); 00073 00074 virtual HRESULT STDMETHODCALLTYPE GiveFeedback( 00075 /* [in] */ DWORD dwEffect); 00076 }; 00077 00078 /// implementation of IDataObject interface 00079 class IDataObjectImpl 00080 : public IComSrvBase<IDataObject, IDataObjectImpl>, public SimpleComObject 00081 //public IAsyncOperation 00082 { 00083 typedef IComSrvBase<IDataObject, IDataObjectImpl> super; 00084 00085 IDropSourceImpl* m_pDropSource; 00086 long m_cRefCount; 00087 00088 StorageArray _storage; 00089 00090 public: 00091 IDataObjectImpl(IDropSourceImpl* pDropSource); 00092 virtual ~IDataObjectImpl(); 00093 00094 void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc); 00095 00096 //IDataObject 00097 virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData( 00098 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn, 00099 /* [out] */ STGMEDIUM __RPC_FAR *pmedium); 00100 00101 virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere( 00102 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc, 00103 /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium); 00104 00105 virtual HRESULT STDMETHODCALLTYPE QueryGetData( 00106 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc); 00107 00108 virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc( 00109 /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn, 00110 /* [out] */ FORMATETC __RPC_FAR *pformatetcOut); 00111 00112 virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData( 00113 /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc, 00114 /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium, 00115 /* [in] */ BOOL fRelease); 00116 00117 virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc( 00118 /* [in] */ DWORD dwDirection, 00119 /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc); 00120 00121 virtual HRESULT STDMETHODCALLTYPE DAdvise( 00122 /* [in] */ FORMATETC __RPC_FAR *pformatetc, 00123 /* [in] */ DWORD advf, 00124 /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink, 00125 /* [out] */ DWORD __RPC_FAR *pdwConnection); 00126 00127 virtual HRESULT STDMETHODCALLTYPE DUnadvise( 00128 /* [in] */ DWORD dwConnection); 00129 00130 virtual HRESULT STDMETHODCALLTYPE EnumDAdvise( 00131 /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise); 00132 00133 //IAsyncOperation 00134 //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode( 00135 // /* [in] */ BOOL fDoOpAsync) 00136 //{ 00137 // return E_NOTIMPL; 00138 //} 00139 // 00140 //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode( 00141 // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync) 00142 //{ 00143 // return E_NOTIMPL; 00144 //} 00145 // 00146 //virtual HRESULT STDMETHODCALLTYPE StartOperation( 00147 // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved) 00148 //{ 00149 // return E_NOTIMPL; 00150 //} 00151 // 00152 //virtual HRESULT STDMETHODCALLTYPE InOperation( 00153 // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp) 00154 //{ 00155 // return E_NOTIMPL; 00156 //} 00157 // 00158 //virtual HRESULT STDMETHODCALLTYPE EndOperation( 00159 // /* [in] */ HRESULT hResult, 00160 // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved, 00161 // /* [in] */ DWORD dwEffects) 00162 //{ 00163 // return E_NOTIMPL; 00164 //}*/ 00165 }; 00166 00167 /// implementation of IDropTarget interface 00168 class IDropTargetImpl : public IDropTarget 00169 { 00170 DWORD m_cRefCount; 00171 bool m_bAllowDrop; 00172 IDropTargetHelper* m_pDropTargetHelper; 00173 00174 FormatArray m_formatetc; 00175 FORMATETC* m_pSupportedFrmt; 00176 00177 protected: 00178 HWND m_hTargetWnd; 00179 00180 public: 00181 IDropTargetImpl(HWND m_hTargetWnd); 00182 virtual ~IDropTargetImpl(); 00183 00184 void AddSuportedFormat(FORMATETC& ftetc) {m_formatetc.push_back(ftetc);} 00185 00186 //return values: true - release the medium. false - don't release the medium 00187 virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) = 0; 00188 00189 virtual HRESULT STDMETHODCALLTYPE QueryInterface( 00190 /* [in] */ REFIID riid, 00191 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); 00192 virtual ULONG STDMETHODCALLTYPE AddRef() {return ++m_cRefCount;} 00193 virtual ULONG STDMETHODCALLTYPE Release(); 00194 00195 bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect); 00196 virtual HRESULT STDMETHODCALLTYPE DragEnter( 00197 /* [unique][in] */ IDataObject __RPC_FAR *pDataObj, 00198 /* [in] */ DWORD grfKeyState, 00199 /* [in] */ POINTL pt, 00200 /* [out][in] */ DWORD __RPC_FAR *pdwEffect); 00201 virtual HRESULT STDMETHODCALLTYPE DragOver( 00202 /* [in] */ DWORD grfKeyState, 00203 /* [in] */ POINTL pt, 00204 /* [out][in] */ DWORD __RPC_FAR *pdwEffect); 00205 virtual HRESULT STDMETHODCALLTYPE DragLeave(); 00206 virtual HRESULT STDMETHODCALLTYPE Drop( 00207 /* [unique][in] */ IDataObject __RPC_FAR *pDataObj, 00208 /* [in] */ DWORD grfKeyState, 00209 /* [in] */ POINTL pt, 00210 /* [out][in] */ DWORD __RPC_FAR *pdwEffect); 00211 }; 00212 00213 /// implementation of IDragSourceHelper interface 00214 class DragSourceHelper 00215 { 00216 IDragSourceHelper* pDragSourceHelper; 00217 00218 public: 00219 DragSourceHelper() 00220 { 00221 if (FAILED(CoCreateInstance(CLSID_DragDropHelper, 00222 NULL, 00223 CLSCTX_INPROC_SERVER, 00224 IID_IDragSourceHelper, 00225 (void**)&pDragSourceHelper))) 00226 pDragSourceHelper = NULL; 00227 } 00228 00229 virtual ~DragSourceHelper() 00230 { 00231 if (pDragSourceHelper != NULL) 00232 { 00233 pDragSourceHelper->Release(); 00234 pDragSourceHelper=NULL; 00235 } 00236 } 00237 00238 // IDragSourceHelper 00239 HRESULT InitializeFromBitmap(HBITMAP hBitmap, 00240 POINT& pt, // cursor position in client coords of the window 00241 RECT& rc, // selected item's bounding rect 00242 IDataObject* pDataObject, 00243 COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect. 00244 ) 00245 { 00246 if (pDragSourceHelper == NULL) 00247 return E_FAIL; 00248 00249 SHDRAGIMAGE di; 00250 BITMAP bm; 00251 GetObject(hBitmap, sizeof(bm), &bm); 00252 di.sizeDragImage.cx = bm.bmWidth; 00253 di.sizeDragImage.cy = bm.bmHeight; 00254 di.hbmpDragImage = hBitmap; 00255 di.crColorKey = crColorKey; 00256 di.ptOffset.x = pt.x - rc.left; 00257 di.ptOffset.y = pt.y - rc.top; 00258 return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject); 00259 } 00260 00261 HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject) 00262 { 00263 if (pDragSourceHelper == NULL) 00264 return E_FAIL; 00265 return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject); 00266 } 00267 };
ROS Explorer Source Code Documentation
generated on 02.01.2013 by ![]() |