//----------------------------------------------------------------------------- // exit point when something is actually dropped STDMETHODIMP CDropTarget::Drop(LPDATAOBJECT pDataObject, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect) { HRESULT hr = S_OK; if(m_pDropTarget) { // this call will actually perform the file operation in pdwEffect hr = m_pDropTarget->Drop(pDataObject, grfKeyState, pt, pdwEffect); // all is said & done // perform cleanup similar to DragLeave() above m_pDropTarget->Release(); m_pDropTarget = NULL; } Release(); return hr; }
void BookmarkToolBar::OnDropTarget(COleDataObject *aOleDataObject, DROPEFFECT aDropEffect, CPoint aPoint, xpr_sint_t aBookmark) { if (aOleDataObject == XPR_NULL) return; BookmarkItem *sBookmarkItem = BookmarkMgr::instance().getBookmark(aBookmark); if (sBookmarkItem == XPR_NULL) return; LPITEMIDLIST sFullPidl = Path2Pidl(sBookmarkItem->mPath); if (sFullPidl != XPR_NULL) { xpr_bool_t sResult; LPSHELLFOLDER sShellFolder = XPR_NULL; LPCITEMIDLIST sPidl = XPR_NULL; sResult = fxfile::base::Pidl::getSimplePidl(sFullPidl, sShellFolder, sPidl); if (XPR_IS_TRUE(sResult)) { POINTL sPointL = {0}; ClientToScreen(&aPoint); sPointL.x = aPoint.x; sPointL.y = aPoint.y; DWORD sKeyState = mDropTarget.isRightDrag() ? MK_RBUTTON : MK_LBUTTON; DWORD sTempEffect = DROPEFFECT_MOVE; switch (aDropEffect) { case DROPEFFECT_MOVE: sKeyState |= MK_SHIFT; break; case DROPEFFECT_COPY: sKeyState |= MK_CONTROL; break; case DROPEFFECT_LINK: sKeyState |= MK_SHIFT | MK_CONTROL; break; } LPDROPTARGET sDropTarget = XPR_NULL; HRESULT sHResult = sShellFolder->GetUIObjectOf( GetSafeHwnd(), 1, (LPCITEMIDLIST*)&sPidl, IID_IDropTarget, XPR_NULL, (LPVOID*)&sDropTarget); if (SUCCEEDED(sHResult) && sDropTarget != XPR_NULL) { LPDATAOBJECT sDataObject = aOleDataObject->Detach(); if (sDataObject != XPR_NULL) { sDropTarget->DragEnter(sDataObject, sKeyState, sPointL, &sTempEffect); sDropTarget->DragOver(sKeyState, sPointL, &sTempEffect); if (mDropTarget.isRightDrag() == XPR_TRUE) aDropEffect = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK; sDropTarget->Drop(sDataObject, sKeyState, sPointL, &aDropEffect); } } COM_RELEASE(sDropTarget); } COM_RELEASE(sShellFolder); } COM_FREE(sFullPidl); }