|
|
|
|
#pragma once
|
|
|
|
|
class CTestDropTarget :public IDropTarget
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
CTestDropTarget()
|
|
|
|
|
{
|
|
|
|
|
nRef = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual ~CTestDropTarget() {}
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// IUnknown
|
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
|
|
|
|
|
/* [in] */ REFIID riid,
|
|
|
|
|
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
|
|
|
|
|
{
|
|
|
|
|
HRESULT hr = S_FALSE;
|
|
|
|
|
if (riid == __uuidof(IUnknown))
|
|
|
|
|
*ppvObject = (IUnknown*)this, hr = S_OK;
|
|
|
|
|
else if (riid == __uuidof(IDropTarget))
|
|
|
|
|
*ppvObject = (IDropTarget*)this, hr = S_OK;
|
|
|
|
|
if (SUCCEEDED(hr)) AddRef();
|
|
|
|
|
return hr;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual ULONG STDMETHODCALLTYPE AddRef(void) { return ++nRef; }
|
|
|
|
|
|
|
|
|
|
virtual ULONG STDMETHODCALLTYPE Release(void) {
|
|
|
|
|
ULONG uRet = --nRef;
|
|
|
|
|
if (uRet == 0) delete this;
|
|
|
|
|
return uRet;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// IDropTarget
|
|
|
|
|
|
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE DragEnter(
|
|
|
|
|
/* [unique][in] */ IDataObject *pDataObj,
|
|
|
|
|
/* [in] */ DWORD grfKeyState,
|
|
|
|
|
/* [in] */ POINTL pt,
|
|
|
|
|
/* [out][in] */ DWORD *pdwEffect)
|
|
|
|
|
{
|
|
|
|
|
*pdwEffect = DROPEFFECT_LINK;
|
|
|
|
|
return S_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE DragOver(
|
|
|
|
|
/* [in] */ DWORD grfKeyState,
|
|
|
|
|
/* [in] */ POINTL pt,
|
|
|
|
|
/* [out][in] */ DWORD *pdwEffect)
|
|
|
|
|
{
|
|
|
|
|
*pdwEffect = DROPEFFECT_LINK;
|
|
|
|
|
return S_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE DragLeave(void)
|
|
|
|
|
{
|
|
|
|
|
return S_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
int nRef;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class CTestDropTarget1 : public CTestDropTarget
|
|
|
|
|
{
|
|
|
|
|
protected:
|
|
|
|
|
SWindow *m_pEdit;
|
|
|
|
|
public:
|
|
|
|
|
CTestDropTarget1(SWindow *pEdit) :m_pEdit(pEdit)
|
|
|
|
|
{
|
|
|
|
|
if (m_pEdit) m_pEdit->AddRef();
|
|
|
|
|
}
|
|
|
|
|
~CTestDropTarget1()
|
|
|
|
|
{
|
|
|
|
|
if (m_pEdit) m_pEdit->Release();
|
|
|
|
|
}
|
|
|
|
|
public:
|
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Drop(
|
|
|
|
|
/* [unique][in] */ IDataObject *pDataObj,
|
|
|
|
|
/* [in] */ DWORD grfKeyState,
|
|
|
|
|
/* [in] */ POINTL pt,
|
|
|
|
|
/* [out][in] */ DWORD *pdwEffect)
|
|
|
|
|
{
|
|
|
|
|
FORMATETC format =
|
|
|
|
|
{
|
|
|
|
|
CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL
|
|
|
|
|
};
|
|
|
|
|
STGMEDIUM medium;
|
|
|
|
|
if (FAILED(pDataObj->GetData(&format, &medium)))
|
|
|
|
|
{
|
|
|
|
|
return S_FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HDROP hdrop = static_cast<HDROP>(GlobalLock(medium.hGlobal));
|
|
|
|
|
|
|
|
|
|
if (!hdrop)
|
|
|
|
|
{
|
|
|
|
|
return S_FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool success = false;
|
|
|
|
|
TCHAR filename[MAX_PATH];
|
|
|
|
|
success = !!DragQueryFile(hdrop, 0, filename, MAX_PATH);
|
|
|
|
|
DragFinish(hdrop);
|
|
|
|
|
GlobalUnlock(medium.hGlobal);
|
|
|
|
|
|
|
|
|
|
if (success && m_pEdit)
|
|
|
|
|
{
|
|
|
|
|
m_pEdit->SetWindowText(filename);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*pdwEffect = DROPEFFECT_LINK;
|
|
|
|
|
return S_OK;
|
|
|
|
|
}
|
|
|
|
|
};
|