WindowsXP-SP1/shell/ext/nsc/dropsrc.c
2020-09-30 16:53:49 +02:00

102 lines
2.4 KiB
C

#include <windows.h>
#include "dropsrc.h"
#include "common.h"
//-----------------------------------------------------------------
typedef struct {
IDropSource dsrc;
UINT cRef;
DWORD grfInitialKeyState;
} CDropSource;
IDropSourceVtbl c_CDropSourceVtbl; // forward decl
HRESULT CDropSource_CreateInstance(IDropSource **ppdsrc)
{
CDropSource *this = (CDropSource *)LocalAlloc(LPTR, sizeof(CDropSource));
if (this)
{
this->dsrc.lpVtbl = &c_CDropSourceVtbl;
this->cRef = 1;
*ppdsrc = &this->dsrc;
return S_OK;
}
else
{
*ppdsrc = NULL;
return E_OUTOFMEMORY;
}
}
STDMETHODIMP CDropSource_QueryInterface(IDropSource *pdsrc, REFIID riid, void **ppvObj)
{
CDropSource *this = IToClass(CDropSource, dsrc, pdsrc);
if (IsEqualIID(riid, &IID_IDropSource) || IsEqualIID(riid, &IID_IUnknown))
{
*ppvObj = this;
this->cRef++;
return S_OK;
}
*ppvObj = NULL;
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CDropSource_AddRef(IDropSource *pdsrc)
{
CDropSource *this = IToClass(CDropSource, dsrc, pdsrc);
this->cRef++;
return this->cRef;
}
STDMETHODIMP_(ULONG) CDropSource_Release(IDropSource *pdsrc)
{
CDropSource *this = IToClass(CDropSource, dsrc, pdsrc);
this->cRef--;
if (this->cRef > 0)
return this->cRef;
LocalFree((HLOCAL)this);
return 0;
}
STDMETHODIMP CDropSource_QueryContinueDrag(IDropSource *pdsrc, BOOL fEscapePressed, DWORD grfKeyState)
{
CDropSource *this = IToClass(CDropSource, dsrc, pdsrc);
if (fEscapePressed)
return DRAGDROP_S_CANCEL;
// initialize ourself with the drag begin button
if (this->grfInitialKeyState == 0)
this->grfInitialKeyState = (grfKeyState & (MK_LBUTTON | MK_RBUTTON | MK_MBUTTON));
Assert(this->grfInitialKeyState);
if (!(grfKeyState & this->grfInitialKeyState))
return DRAGDROP_S_DROP;
else
return S_OK;
}
STDMETHODIMP CDropSource_GiveFeedback(IDropSource *pdsrc, DWORD dwEffect)
{
CDropSource *this = IToClass(CDropSource, dsrc, pdsrc);
return DRAGDROP_S_USEDEFAULTCURSORS;
}
IDropSourceVtbl c_CDropSourceVtbl = {
CDropSource_QueryInterface, CDropSource_AddRef, CDropSource_Release,
CDropSource_QueryContinueDrag,
CDropSource_GiveFeedback
};