implementation of IDropTarget interface More...
#include <dragdropimpl.h>
Public Member Functions | |
IDropTargetImpl (HWND m_hTargetWnd) | |
virtual | ~IDropTargetImpl () |
void | AddSuportedFormat (FORMATETC &ftetc) |
virtual bool | OnDrop (FORMATETC *pFmtEtc, STGMEDIUM &medium, DWORD *pdwEffect)=0 |
virtual HRESULT STDMETHODCALLTYPE | QueryInterface (REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) |
virtual ULONG STDMETHODCALLTYPE | AddRef () |
virtual ULONG STDMETHODCALLTYPE | Release () |
bool | QueryDrop (DWORD grfKeyState, LPDWORD pdwEffect) |
virtual HRESULT STDMETHODCALLTYPE | DragEnter (IDataObject __RPC_FAR *pDataObj, DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect) |
virtual HRESULT STDMETHODCALLTYPE | DragOver (DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect) |
virtual HRESULT STDMETHODCALLTYPE | DragLeave () |
virtual HRESULT STDMETHODCALLTYPE | Drop (IDataObject __RPC_FAR *pDataObj, DWORD grfKeyState, POINTL pt, DWORD __RPC_FAR *pdwEffect) |
Protected Attributes | |
HWND | m_hTargetWnd |
implementation of IDropTarget interface
Definition at line 168 of file dragdropimpl.h.
IDropTargetImpl::IDropTargetImpl | ( | HWND | m_hTargetWnd ) |
Definition at line 331 of file dragdropimpl.cpp.
References m_hTargetWnd.
: m_cRefCount(0), m_bAllowDrop(false), m_pDropTargetHelper(NULL), m_pSupportedFrmt(NULL), m_hTargetWnd(hTargetWnd) { assert(m_hTargetWnd != NULL); if (FAILED(CoCreateInstance(CLSID_DragDropHelper, NULL, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper,(LPVOID*)&m_pDropTargetHelper))) m_pDropTargetHelper = NULL; }
IDropTargetImpl::~IDropTargetImpl | ( | ) | [virtual] |
Definition at line 345 of file dragdropimpl.cpp.
{
if (m_pDropTargetHelper != NULL)
{
m_pDropTargetHelper->Release();
m_pDropTargetHelper = NULL;
}
}
virtual ULONG STDMETHODCALLTYPE IDropTargetImpl::AddRef | ( | ) | [inline, virtual] |
Definition at line 192 of file dragdropimpl.h.
Referenced by ShellBrowser::InitDragDrop(), and DesktopShellView::InitDragDrop().
{return ++m_cRefCount;}
void IDropTargetImpl::AddSuportedFormat | ( | FORMATETC & | ftetc ) | [inline] |
Definition at line 184 of file dragdropimpl.h.
Referenced by ShellBrowser::InitDragDrop(), and DesktopShellView::InitDragDrop().
{m_formatetc.push_back(ftetc);}
HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragEnter | ( | IDataObject __RPC_FAR * | pDataObj, |
DWORD | grfKeyState, | ||
POINTL | pt, | ||
DWORD __RPC_FAR * | pdwEffect | ||
) | [virtual] |
Definition at line 424 of file dragdropimpl.cpp.
References m_hTargetWnd, and QueryDrop().
{ if (pDataObj == NULL) return E_INVALIDARG; if (m_pDropTargetHelper) m_pDropTargetHelper->DragEnter(m_hTargetWnd, pDataObj, (LPPOINT)&pt, *pdwEffect); //IEnumFORMATETC* pEnum; //pDataObj->EnumFormatEtc(DATADIR_GET,&pEnum); //FORMATETC ftm; //for() //pEnum->Next(1,&ftm,0); //pEnum->Release(); m_pSupportedFrmt = NULL; for(FormatArray::iterator it=m_formatetc.begin(); it!=m_formatetc.end(); ++it) { m_bAllowDrop = (pDataObj->QueryGetData(&*it) == S_OK)? true: false; if (m_bAllowDrop) { m_pSupportedFrmt = &*it; break; } } QueryDrop(grfKeyState, pdwEffect); return S_OK; }
HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragLeave | ( | void | ) | [virtual] |
Reimplemented in DesktopDropTarget, and TreeDropTarget.
Definition at line 473 of file dragdropimpl.cpp.
Referenced by DesktopDropTarget::DragLeave().
{ if (m_pDropTargetHelper) m_pDropTargetHelper->DragLeave(); m_bAllowDrop = false; m_pSupportedFrmt = NULL; return S_OK; }
HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragOver | ( | DWORD | grfKeyState, |
POINTL | pt, | ||
DWORD __RPC_FAR * | pdwEffect | ||
) | [virtual] |
Reimplemented in DesktopDropTarget, and TreeDropTarget.
Definition at line 460 of file dragdropimpl.cpp.
References QueryDrop().
Referenced by DesktopDropTarget::DragOver().
{ if (m_pDropTargetHelper) m_pDropTargetHelper->DragOver((LPPOINT)&pt, *pdwEffect); QueryDrop(grfKeyState, pdwEffect); return S_OK; }
HRESULT STDMETHODCALLTYPE IDropTargetImpl::Drop | ( | IDataObject __RPC_FAR * | pDataObj, |
DWORD | grfKeyState, | ||
POINTL | pt, | ||
DWORD __RPC_FAR * | pdwEffect | ||
) | [virtual] |
Definition at line 484 of file dragdropimpl.cpp.
References OnDrop(), and QueryDrop().
{ if (pDataObj == NULL) return E_INVALIDARG; if (m_pDropTargetHelper) m_pDropTargetHelper->Drop(pDataObj, (LPPOINT)&pt, *pdwEffect); if (QueryDrop(grfKeyState, pdwEffect)) { if (m_bAllowDrop && m_pSupportedFrmt != NULL) { STGMEDIUM medium; if (pDataObj->GetData(m_pSupportedFrmt, &medium) == S_OK) { if (OnDrop(m_pSupportedFrmt, medium, pdwEffect)) //does derive class wants us to free medium? ReleaseStgMedium(&medium); } } } m_bAllowDrop = false; *pdwEffect = DROPEFFECT_NONE; m_pSupportedFrmt = NULL; return S_OK; }
virtual bool IDropTargetImpl::OnDrop | ( | FORMATETC * | pFmtEtc, |
STGMEDIUM & | medium, | ||
DWORD * | pdwEffect | ||
) | [pure virtual] |
Implemented in DesktopDropTarget, and TreeDropTarget.
Referenced by Drop().
bool IDropTargetImpl::QueryDrop | ( | DWORD | grfKeyState, |
LPDWORD | pdwEffect | ||
) |
Definition at line 382 of file dragdropimpl.cpp.
Referenced by DragEnter(), DragOver(), and Drop().
{ DWORD dwOKEffects = *pdwEffect; if (!m_bAllowDrop) { *pdwEffect = DROPEFFECT_NONE; return false; } //CTRL+SHIFT -- DROPEFFECT_LINK //CTRL -- DROPEFFECT_COPY //SHIFT -- DROPEFFECT_MOVE //no modifier -- DROPEFFECT_MOVE or whatever is allowed by src *pdwEffect = (grfKeyState & MK_CONTROL) ? ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_LINK : DROPEFFECT_COPY ): ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_MOVE : DROPEFFECT_NONE ); if (*pdwEffect == 0) { // No modifier keys used by user while dragging. if (DROPEFFECT_COPY & dwOKEffects) *pdwEffect = DROPEFFECT_COPY; else if (DROPEFFECT_MOVE & dwOKEffects) *pdwEffect = DROPEFFECT_MOVE; else if (DROPEFFECT_LINK & dwOKEffects) *pdwEffect = DROPEFFECT_LINK; else { *pdwEffect = DROPEFFECT_NONE; } } else { // Check if the drag source application allows the drop effect desired by user. // The drag source specifies this in DoDragDrop if (!(*pdwEffect & dwOKEffects)) *pdwEffect = DROPEFFECT_NONE; } return (DROPEFFECT_NONE == *pdwEffect)?false:true; }
HRESULT STDMETHODCALLTYPE IDropTargetImpl::QueryInterface | ( | REFIID | riid, |
void __RPC_FAR *__RPC_FAR * | ppvObject | ||
) | [virtual] |
Definition at line 354 of file dragdropimpl.cpp.
{ *ppvObject = NULL; if (IID_IUnknown==riid || IID_IDropTarget==riid) *ppvObject=this; if (*ppvObject != NULL) { ((LPUNKNOWN)*ppvObject)->AddRef(); return S_OK; } return E_NOINTERFACE; }
ULONG STDMETHODCALLTYPE IDropTargetImpl::Release | ( | ) | [virtual] |
Definition at line 370 of file dragdropimpl.cpp.
Referenced by ShellBrowser::InitDragDrop(), DesktopShellView::InitDragDrop(), and ShellBrowser::~ShellBrowser().
{ long nTemp = --m_cRefCount; assert(nTemp >= 0); if (nTemp == 0) delete this; return nTemp; }
HWND IDropTargetImpl::m_hTargetWnd [protected] |
Definition at line 178 of file dragdropimpl.h.
Referenced by DragEnter(), TreeDropTarget::DragLeave(), TreeDropTarget::DragOver(), DesktopDropTarget::DragOver(), IDropTargetImpl(), and TreeDropTarget::OnDrop().
ROS Explorer Source Code Documentation
generated on 02.01.2013 by ![]() |