// // 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; }