windows-nt/Source/XPSP1/NT/shell/browseui/mbdrop.cpp
2020-09-26 16:20:57 +08:00

126 lines
2.9 KiB
C++

//
// Routines for implementing drop target capability to menubands.
//
#include "priv.h"
#include "mbdrop.h"
#include "iface.h" // for MBIF_
#define SUPERCLASS
//=================================================================
// Implementation of CMenuBandDropTarget
//=================================================================
// Constructor
CMenuBandDropTarget::CMenuBandDropTarget(HWND hwnd, int idTarget, DWORD dwFlags) :
_cRef(1), _hwndParent(hwnd), _idTarget(idTarget), _dwFlagsMBIF(dwFlags)
{
}
STDMETHODIMP_(ULONG) CMenuBandDropTarget::AddRef()
{
_cRef++;
return _cRef;
}
STDMETHODIMP_(ULONG) CMenuBandDropTarget::Release()
{
ASSERT(_cRef > 0);
_cRef--;
if (_cRef > 0)
return _cRef;
delete this;
return 0;
}
STDMETHODIMP CMenuBandDropTarget::QueryInterface(REFIID riid, void **ppvObj)
{
HRESULT hres;
static const QITAB qit[] = {
QITABENT(CMenuBandDropTarget, IDropTarget),
{ 0 },
};
hres = QISearch(this, (LPCQITAB)qit, riid, ppvObj);
return hres;
}
/*----------------------------------------------------------
Purpose: IDropTarget::DragEnter method
*/
STDMETHODIMP CMenuBandDropTarget::DragEnter(IDataObject * pdtobj, DWORD grfKeyState,
POINTL pt, DWORD * pdwEffect)
{
// If this item cascades out, then we want to pop the submenu open
// after a timer. We don't allow a drop on the cascadable item
// itself. (We could, but then we'd have to default to a location
// inside the submenu, and I'm lazy right now.)
if (*pdwEffect & (DROPEFFECT_MOVE | DROPEFFECT_COPY))
{
if (_dwFlagsMBIF & SMIF_SUBMENU)
{
// _idTimer = SetTimer(NULL, 0, 2000,
}
*pdwEffect &= (DROPEFFECT_MOVE | DROPEFFECT_COPY);
}
else
*pdwEffect = DROPEFFECT_NONE;
return S_OK;
}
/*----------------------------------------------------------
Purpose: IDropTarget::DragOver method
*/
STDMETHODIMP CMenuBandDropTarget::DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
{
*pdwEffect &= (DROPEFFECT_MOVE | DROPEFFECT_COPY);
return S_OK;
}
/*----------------------------------------------------------
Purpose: IDropTarget::DragLeave method
*/
STDMETHODIMP CMenuBandDropTarget::DragLeave(void)
{
// Kill timer, release object
return S_OK;
}
/*----------------------------------------------------------
Purpose: IDropTarget::Drop method
*/
STDMETHODIMP CMenuBandDropTarget::Drop(IDataObject * pdtobj, DWORD grfKeyState, POINTL pt,
DWORD * pdwEffect)
{
if (*pdwEffect & (DROPEFFECT_MOVE | DROPEFFECT_COPY))
{
if (_dwFlagsMBIF & SMIF_SUBMENU)
{
// We don't allow drops on submenu items. Must go into
// cascaded menu.
*pdwEffect = DROPEFFECT_NONE;
}
}
return S_OK;
}