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
|