|
//---------------------------------------------------------------------------
#include <vcl.h>
#include <oleidl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
class CDropTarget : public IDropTarget
{
public:
// IUnknown implementation
HRESULT __stdcall QueryInterface (REFIID iid, void ** ppvObject);
ULONG __stdcall AddRef (void);
ULONG __stdcall Release (void);
// IDropTarget implementation
HRESULT __stdcall DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
HRESULT __stdcall DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
HRESULT __stdcall DragLeave(void);
HRESULT __stdcall Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
// Constructor
CDropTarget(HWND hwnd);
~CDropTarget();
// internal helper function
bool __stdcall QueryDrop(DWORD grfKeyState, DWORD *pdwEffect);
private:
// Private member variables
LONG m_lRefCount;
HWND m_hWnd;
};
CDropTarget::CDropTarget(HWND hwnd) : m_hWnd(hwnd), m_lRefCount(1)
{
}
CDropTarget::~CDropTarget()
{
}
HRESULT __stdcall CDropTarget::QueryInterface (REFIID iid, void ** ppvObject)
{
if(iid == IID_IDropTarget || iid == IID_IUnknown)
{
AddRef();
*ppvObject = this;
return S_OK;
}
else
{
*ppvObject = 0;
return E_NOINTERFACE;
}
}
ULONG __stdcall CDropTarget::AddRef(void)
{
return InterlockedIncrement(&m_lRefCount);
}
ULONG __stdcall CDropTarget::Release(void)
{
LONG count = InterlockedDecrement(&m_lRefCount);
if(count == 0)
{
delete this;
return 0;
}
else
{
return count;
}
}
DWORD DropEffect(DWORD dwAllowed)
{
DWORD dwEffect = dwAllowed & DROPEFFECT_COPY;
if(dwEffect == 0)
dwEffect = dwAllowed;
return dwEffect;
}
HRESULT __stdcall CDropTarget::DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
{
*pdwEffect = DropEffect(*pdwEffect);
return S_OK;
}
HRESULT __stdcall CDropTarget::DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
{
*pdwEffect = DropEffect(*pdwEffect);
return S_OK;
}
HRESULT __stdcall CDropTarget::DragLeave(void)
{
return S_OK;
}
HRESULT __stdcall CDropTarget::Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
{
FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgmed;
if(pDataObject->GetData(&fmtetc, &stgmed) == S_OK)
{
// We need to lock the HGLOBAL handle because we can't
// be sure if this is GMEM_FIXED (i.e. normal heap) data or not
char *data = (char *)GlobalLock(stgmed.hGlobal);
Form2->Caption = data;
}
*pdwEffect = DROPEFFECT_NONE;//DropEffect(*pdwEffect);
return S_OK;
}
void RegisterDropWindow(HWND hwnd)
{
CDropTarget *pDropTarget = new CDropTarget(hwnd);
RegisterDragDrop(hwnd, pDropTarget);
}
void UnregisterDropWindow(HWND hwnd)
{
RevokeDragDrop(hwnd);
}
//--------------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
OleInitialize(0);
InitCommonControls();
RegisterDropWindow(Handle);
}
//---------------------------------------------------------------------------
빌초 님이 쓰신 글 :
: 익스플로러 창에 있는 URL을
:
: Form 위에 드래그&드롭 해서 그 URL을 알고 싶은데
:
: 어떻게 해야 하나요?
|