1 /**************************************************************************
2 THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
3 ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
4 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
6 Author: Leon Finker 01/2001
7 Modifications: removed ATL dependencies, Martin Fuchs 7/2003
8 **************************************************************************/
10 #include "dragdropimpl.h"
12 /// OLE drop target for tree controls
13 class TreeDropTarget
: public IDropTargetImpl
16 TreeDropTarget(HWND hTargetWnd
) : IDropTargetImpl(hTargetWnd
) {}
18 virtual bool OnDrop(FORMATETC
* pFmtEtc
, STGMEDIUM
& medium
, DWORD
*pdwEffect
)
20 if (pFmtEtc
->cfFormat
== CF_HDROP
&& medium
.tymed
== TYMED_HGLOBAL
)
22 HDROP hDrop
= (HDROP
)GlobalLock(medium
.hGlobal
);
25 TCHAR szFileName
[MAX_PATH
];
27 UINT cFiles
= DragQueryFile(hDrop
, 0xFFFFFFFF, NULL
, 0);
29 for(UINT i
= 0; i
< cFiles
; ++i
)
31 DragQueryFile(hDrop
, i
, szFileName
, sizeof(szFileName
));
33 if (DROPEFFECT_COPY
& *pdwEffect
)
35 // copy the file or dir
37 ///@todo Add the code to handle Copy
40 else if (DROPEFFECT_MOVE
& *pdwEffect
)
42 // move the file or dir
44 ///@todo Add the code to handle Move
48 //DragFinish(hDrop); // base class calls ReleaseStgMedium
50 GlobalUnlock(medium
.hGlobal
);
53 TreeView_SelectDropTarget(m_hTargetWnd
, NULL
);
55 return true; //let base free the medium
58 virtual HRESULT STDMETHODCALLTYPE
DragOver(
59 /* [in] */ DWORD grfKeyState
,
61 /* [out][in] */ DWORD __RPC_FAR
*pdwEffect
)
65 ScreenToClient(m_hTargetWnd
, &hit
.pt
);
66 hit
.flags
= TVHT_ONITEM
;
67 HTREEITEM hItem
= TreeView_HitTest(m_hTargetWnd
,&hit
);
70 TreeView_SelectDropTarget(m_hTargetWnd
, hItem
);
72 return IDropTargetImpl::DragOver(grfKeyState
, pt
, pdwEffect
);
75 virtual HRESULT STDMETHODCALLTYPE
DragLeave(void)
77 TreeView_SelectDropTarget(m_hTargetWnd
, NULL
);
79 return IDropTargetImpl::DragLeave();