// .h 파일
class ATL_NO_VTABLE CTestControl :
...
public IDropTarget // 인터페이스 추가
...
{
...
// 오버라이딩
STDMETHOD(DragEnter)(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
STDMETHOD(DragOver)(DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
STDMETHOD(DragLeave)(void);
STDMETHOD(Drop)(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect);
...
}
// .cpp 파일
// 초기화 부분에 추가
::RegisterDragDrop(m_hWnd, (IDropTarget*)this);
// 함수구현
HRESULT CTestControl ::DragEnter(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
return S_OK;
}
HRESULT CTestControl ::DragOver(DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
return S_OK;
}
HRESULT CTestControl ::DragLeave(void)
{
return S_OK;
}
HRESULT CTestControl ::Drop(LPDATAOBJECT pDataObject, DWORD dwKeyState, POINTL pt, LPDWORD pdwEffect)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // init MFC
COleDataObject DataObj;
HGLOBAL hGlobal;
HDROP hDropInfo;
DataObj.Attach(pDataObject, FALSE);
// Data Object 에서 리스트를 읽어온다.
// HDROP 구조체에 저장되므로, HDROP 핸들을 얻어와 Drag&Drop API를 사용하면 된다.
hGlobal = DataObj.GetGlobalData (CF_HDROP);
if ( NULL != hGlobal )
{
hDropInfo = (HDROP) GlobalLock (hGlobal);
UINT uDropCnt = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); // 드롭된 파일의 갯수
char buffer[256]; // Drag&Drop된 파일,폴더의 절대경로 저장
for(UINT i=0; i<uDropCnt; i++)
{
// 파일의 경로 얻어옴
DragQueryFile(hDropInfo, i, buffer, 255);
// 파일경로 확인
::MessageBox(NULL, buffer, _T("Filename"), MB_OK);
}
GlobalUnlock (hGlobal);
}
DataObj.Detach();
return S_OK;
}
GlobalUnlock (hGlobal);
}
DataObj.Detach();
return S_OK;
}