IEShellDragDrop.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:5k
- //*******************************************************************************
- // COPYRIGHT NOTES
- // ---------------
- // You may use this source code, compile or redistribute it as part of your application
- // for free. You cannot redistribute it as a part of a software development
- // library without the agreement of the author. If the sources are
- // distributed along with the application, you should leave the original
- // copyright notes in the source code without any changes.
- // This code can be used WITHOUT ANY WARRANTIES at your own risk.
- //
- // For the latest updates to this code, check this site:
- // http://www.masmex.com
- // after Sept 2000
- //
- // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
- //*******************************************************************************
- #include "stdafx.h"
- #include "IEShellDragDrop.h"
- #include "cbformats.h"
- #ifndef OleStdGetDropEffect
- #define OleStdGetDropEffect(grfKeyState)
- ( (grfKeyState & MK_CONTROL) ?
- ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_LINK : DROPEFFECT_COPY ) :
- ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_MOVE : DROPEFFECT_NONE ) )
- #endif
- bool CIEShellDragDrop::DragEnter(CDD_OleDropTargetInfo *pInfo,LPSHELLFOLDER psfFolder,LPITEMIDLIST pidl)
- {
- // DWORD dwEffect = m_ShellPidl.GetDragDropAttributes(pInfo->GetDataObject()->m_lpDataObject);
- IDropTarget *pdt=NULL;
- if (psfFolder == NULL)
- psfFolder = m_psfDesktop;
- HRESULT hr = psfFolder->GetUIObjectOf(pInfo->GetSafeHwnd(),1,(LPCITEMIDLIST*)&pidl, IID_IDropTarget, NULL, (LPVOID*)&pdt);
- if (FAILED(hr))
- return false;
- DWORD dwKeyState = pInfo->GetKeyboardState();
- CPoint pt(pInfo->GetPoint());
- ::ClientToScreen(pInfo->GetSafeHwnd(),&pt);
- POINTL ptl;
- ptl.x = pt.x;
- ptl.y = pt.y;
- DWORD dwEffect=0;
- pdt->DragEnter(pInfo->GetDataObject()->m_lpDataObject, dwKeyState, ptl, &dwEffect);
- pdt->DragLeave();
- pInfo->SetDropEffect(dwEffect);
- pdt->Release();
- return true;
- }
- bool CIEShellDragDrop::DragLeave(CDD_OleDropTargetInfo *pInfo)
- {
- return false;
- }
- bool CIEShellDragDrop::DragOver(CDD_OleDropTargetInfo *pInfo,LPSHELLFOLDER psfFolder,LPITEMIDLIST pidl)
- {
- pInfo->SetDropEffect(DROPEFFECT_NONE);
- IDropTarget *pdt=NULL;
- if (psfFolder == NULL)
- psfFolder = m_psfDesktop;
- HRESULT hr = psfFolder->GetUIObjectOf(pInfo->GetSafeHwnd(),1,(LPCITEMIDLIST*)&pidl, IID_IDropTarget, NULL, (LPVOID*)&pdt);
- if (FAILED(hr))
- return false;
- DWORD dwKeyState = pInfo->GetKeyboardState();
- TRACE1("dwKeyState=%un",dwKeyState);
- CPoint pt(pInfo->GetPoint());
- ::ClientToScreen(pInfo->GetSafeHwnd(),&pt);
- POINTL ptl;
- ptl.x = pt.x;
- ptl.y = pt.y;
- DWORD dwEffect=OleStdGetDropEffect(dwKeyState);
- if (dwEffect == DROPEFFECT_NONE)
- dwEffect = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;
- TRACE1("dropEffect=%un",dwEffect);
- pdt->DragEnter(pInfo->GetDataObject()->m_lpDataObject, dwKeyState, ptl, &dwEffect);
- pdt->DragOver(dwKeyState, ptl, &dwEffect);
- pdt->DragLeave();
- pdt->Release();
- pInfo->SetDropEffect(dwEffect);
- return true;
- }
- bool CIEShellDragDrop::DragDrop(CDD_OleDropTargetInfo *pInfo,LPSHELLFOLDER psfFolder,LPITEMIDLIST pidl)
- {
- IDropTarget *pdt=NULL;
- if (psfFolder == NULL)
- psfFolder = m_psfDesktop;
- HRESULT hr = psfFolder->GetUIObjectOf(pInfo->GetSafeHwnd(),1,(LPCITEMIDLIST*)&pidl, IID_IDropTarget, NULL, (LPVOID*)&pdt);
- if (FAILED(hr))
- return false;
- CPoint pt(pInfo->GetPoint());
- TRACE2("Drop received at point(client) %d,%dn",pt.x,pt.y);
- ::ClientToScreen(pInfo->GetSafeHwnd(),&pt);
- TRACE2("Drop received at point(screen) %d,%dn",pt.x,pt.y);
- CWDClipboardData::Instance()->IsDataAvailable(pInfo->GetDataObject());
- #ifdef _DEBUG
- if (pInfo->GetDataObject()->IsDataAvailable(CF_TEXT))
- {
- CCF_String cfString;
- if (CWDClipboardData::Instance()->GetData(pInfo->GetDataObject(),&cfString,CWDClipboardData::e_cfString))
- {
- TRACE1("Received CF_TEXT %sn",cfString.GetString());
- }
- }
- if (pInfo->GetDataObject()->IsDataAvailable(CF_HDROP))
- {
- CCF_HDROP cfHDROP;
- if (CWDClipboardData::Instance()->GetData(pInfo->GetDataObject(),&cfHDROP,CWDClipboardData::e_cfHDROP))
- {
- for(UINT i=0;i < cfHDROP.GetCount();i++)
- TRACE2("Received CF_HDROP %s (%u)n",cfHDROP.GetFileName(i),i);
- }
- }
- #endif
- POINTL ptl;
- ptl.x = pt.x;
- ptl.y = pt.y;
- DWORD dwKeyState = pInfo->GetKeyboardState();
- DWORD dw = DROPEFFECT_MOVE;
- pdt->DragEnter(pInfo->GetDataObject()->m_lpDataObject, dwKeyState, ptl, &dw);
- pdt->DragOver(dwKeyState, ptl, &dw);
- DWORD dwEffect = m_ShellPidl.GetDragDropAttributes(pInfo->GetDataObject());
- TRACE2("Keyboardstate=%u DragDropEffect=%un",dwKeyState,dwEffect);
- pdt->Drop(pInfo->GetDataObject()->m_lpDataObject, dwKeyState, ptl, &dwEffect);
- pdt->Release();
- return true;
- }