实现从IE中拖放URL的类
.h文件
#include "oleidl.h"
#include "controls.hpp"
//---------------------------------------------------------------------------
class TMyDropTarget : public IDropTarget
{
public:
__property void __fastcall (__closure *OnGetFormat)(IDropTarget *Sender,IDataObject *DataObject,DWORD KeyState, TPoint pt, DWORD &dpe,bool &bDataOK) = {read=_FGetFormat,write=_FGetFormat};
__property void __fastcall (__closure *OnProcessData)(IDropTarget *Sender,IDataObject *DataObject,DWORD KeyState, TPoint pt) = { read=_FProcessData,write=_FProcessData};
__property void __fastcall (__closure *OnProcessText)(IDropTarget *Sender,AnsiString AText,DWORD KeyState, TPoint pt) = {read=_FProcessText,write=_FProcessText};
TMyDropTarget(TWinControl *AOwner);
~TMyDropTarget();
HRESULT __stdcall QueryInterface(const GUID &iid,void **ppv);
ULONG __stdcall AddRef(void){return ++_iRefCount;}
ULONG __stdcall Release(void){if(--_iRefCount==0){delete this;}return _iRefCount;}
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);
private:
ULONG _iRefCount;
IDataObject *_lpDataObj;
TWinControl *_OwnerControl;
void __fastcall (__closure *_FGetFormat)(IDropTarget *Sender,IDataObject *DataObject,DWORD KeyState,TPoint pt,DWORD &dpe,bool &bDataOK);
void __fastcall (__closure *_FProcessData)(IDropTarget *Sender,IDataObject *DataObject,DWORD KeyState,TPoint pt);
void __fastcall (__closure *_FProcessText)(IDropTarget *Sender,AnsiString AText,DWORD KeyState,TPoint pt);
bool __fastcall FDataFormatOK(DWORD KeyState,POINTL pt,DWORD &dpe);
void __fastcall FProcessData(DWORD KeyState,POINTL pt);
};
#include "controls.hpp"
//---------------------------------------------------------------------------
class TMyDropTarget : public IDropTarget
{
public:
__property void __fastcall (__closure *OnGetFormat)(IDropTarget *Sender,IDataObject *DataObject,DWORD KeyState, TPoint pt, DWORD &dpe,bool &bDataOK) = {read=_FGetFormat,write=_FGetFormat};
__property void __fastcall (__closure *OnProcessData)(IDropTarget *Sender,IDataObject *DataObject,DWORD KeyState, TPoint pt) = { read=_FProcessData,write=_FProcessData};
__property void __fastcall (__closure *OnProcessText)(IDropTarget *Sender,AnsiString AText,DWORD KeyState, TPoint pt) = {read=_FProcessText,write=_FProcessText};
TMyDropTarget(TWinControl *AOwner);
~TMyDropTarget();
HRESULT __stdcall QueryInterface(const GUID &iid,void **ppv);
ULONG __stdcall AddRef(void){return ++_iRefCount;}
ULONG __stdcall Release(void){if(--_iRefCount==0){delete this;}return _iRefCount;}
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);
private:
ULONG _iRefCount;
IDataObject *_lpDataObj;
TWinControl *_OwnerControl;
void __fastcall (__closure *_FGetFormat)(IDropTarget *Sender,IDataObject *DataObject,DWORD KeyState,TPoint pt,DWORD &dpe,bool &bDataOK);
void __fastcall (__closure *_FProcessData)(IDropTarget *Sender,IDataObject *DataObject,DWORD KeyState,TPoint pt);
void __fastcall (__closure *_FProcessText)(IDropTarget *Sender,AnsiString AText,DWORD KeyState,TPoint pt);
bool __fastcall FDataFormatOK(DWORD KeyState,POINTL pt,DWORD &dpe);
void __fastcall FProcessData(DWORD KeyState,POINTL pt);
};
.cpp文件
//---------------------------------------------------------------------------
TMyDropTarget::TMyDropTarget(TWinControl *AOwner)
{
_OwnerControl = AOwner;
_iRefCount = 0;
_lpDataObj = NULL;
_FGetFormat = NULL;
_FProcessData = NULL;
_FProcessText = NULL;
RegisterDragDrop(_OwnerControl->Handle,this);
}
//---------------------------------------------------------------------------
TMyDropTarget::~TMyDropTarget()
{
RevokeDragDrop(_OwnerControl->Handle);
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::QueryInterface(const GUID &iid,void **ppv)
{
if((iid==IID_IUnknown)||(iid==IID_IDropTarget))
{
*ppv=this;
AddRef();
}
else
{
*ppv=NULL;
return E_NOINTERFACE;
}
return S_OK;
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::DragEnter(IDataObject *pDataObject,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect)
{
_lpDataObj = pDataObject;
FDataFormatOK(grfKeyState,pt,*pdwEffect);
return S_OK;
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::DragOver(DWORD grfKeyState,POINTL pt,DWORD *pdwEffect)
{
FDataFormatOK(grfKeyState,pt,*pdwEffect);
return S_OK;
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::DragLeave(void)
{
return S_OK;
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::Drop(IDataObject *pDataObject,DWORD grfKeyState, POINTL pt,DWORD *pdwEffect)
{
_lpDataObj = pDataObject;
if(FDataFormatOK(grfKeyState,pt,*pdwEffect))
FProcessData(grfKeyState,pt);
return S_OK;
}
//---------------------------------------------------------------------------
bool __fastcall TMyDropTarget::FDataFormatOK(DWORD KeyState,POINTL pt,DWORD &dpe)
{
FORMATETC fetc={CF_TEXT,0,DVASPECT_CONTENT,-1,DWORD(-1)};
bool bOK=_lpDataObj->QueryGetData(&fetc)==S_OK;
/*
文本拖放:bOK?DROPEFFECT_COPY:DROPEFFECT_NONE;
*/
dpe = bOK?DROPEFFECT_LINK:DROPEFFECT_NONE;
if(_FGetFormat)
{
TPoint point(pt.x,pt.y);
::ScreenToClient(_OwnerControl->Handle,&point);
_FGetFormat(this,_lpDataObj,KeyState,point,dpe,bOK);
}
return bOK;
}
//---------------------------------------------------------------------------
void __fastcall TMyDropTarget::FProcessData(DWORD KeyState,POINTL pt)
{
if(_FProcessData)
{
TPoint point(pt.x,pt.y);
::ScreenToClient(_OwnerControl->Handle,&point);
_FProcessData(this,_lpDataObj,KeyState,point);
}
else if(_FProcessText)
{
STGMEDIUM smed;
FORMATETC fetc={CF_TEXT,0,DVASPECT_CONTENT,-1,DWORD(-1)};
BOOL bValue=(_lpDataObj->GetData(&fetc,&smed)==S_OK);
if(bValue)
{
HGLOBAL hData = GlobalLock(smed.hGlobal);
if(hData)
{
TPoint point(pt.x,pt.y);
::ScreenToClient(_OwnerControl->Handle,&point);
_FProcessText(this,(char*)hData,KeyState,point);
GlobalUnlock(hData);
GlobalFree(hData);
}
}
}
}
TMyDropTarget::TMyDropTarget(TWinControl *AOwner)
{
_OwnerControl = AOwner;
_iRefCount = 0;
_lpDataObj = NULL;
_FGetFormat = NULL;
_FProcessData = NULL;
_FProcessText = NULL;
RegisterDragDrop(_OwnerControl->Handle,this);
}
//---------------------------------------------------------------------------
TMyDropTarget::~TMyDropTarget()
{
RevokeDragDrop(_OwnerControl->Handle);
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::QueryInterface(const GUID &iid,void **ppv)
{
if((iid==IID_IUnknown)||(iid==IID_IDropTarget))
{
*ppv=this;
AddRef();
}
else
{
*ppv=NULL;
return E_NOINTERFACE;
}
return S_OK;
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::DragEnter(IDataObject *pDataObject,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect)
{
_lpDataObj = pDataObject;
FDataFormatOK(grfKeyState,pt,*pdwEffect);
return S_OK;
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::DragOver(DWORD grfKeyState,POINTL pt,DWORD *pdwEffect)
{
FDataFormatOK(grfKeyState,pt,*pdwEffect);
return S_OK;
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::DragLeave(void)
{
return S_OK;
}
//---------------------------------------------------------------------------
HRESULT __stdcall TMyDropTarget::Drop(IDataObject *pDataObject,DWORD grfKeyState, POINTL pt,DWORD *pdwEffect)
{
_lpDataObj = pDataObject;
if(FDataFormatOK(grfKeyState,pt,*pdwEffect))
FProcessData(grfKeyState,pt);
return S_OK;
}
//---------------------------------------------------------------------------
bool __fastcall TMyDropTarget::FDataFormatOK(DWORD KeyState,POINTL pt,DWORD &dpe)
{
FORMATETC fetc={CF_TEXT,0,DVASPECT_CONTENT,-1,DWORD(-1)};
bool bOK=_lpDataObj->QueryGetData(&fetc)==S_OK;
/*
文本拖放:bOK?DROPEFFECT_COPY:DROPEFFECT_NONE;
*/
dpe = bOK?DROPEFFECT_LINK:DROPEFFECT_NONE;
if(_FGetFormat)
{
TPoint point(pt.x,pt.y);
::ScreenToClient(_OwnerControl->Handle,&point);
_FGetFormat(this,_lpDataObj,KeyState,point,dpe,bOK);
}
return bOK;
}
//---------------------------------------------------------------------------
void __fastcall TMyDropTarget::FProcessData(DWORD KeyState,POINTL pt)
{
if(_FProcessData)
{
TPoint point(pt.x,pt.y);
::ScreenToClient(_OwnerControl->Handle,&point);
_FProcessData(this,_lpDataObj,KeyState,point);
}
else if(_FProcessText)
{
STGMEDIUM smed;
FORMATETC fetc={CF_TEXT,0,DVASPECT_CONTENT,-1,DWORD(-1)};
BOOL bValue=(_lpDataObj->GetData(&fetc,&smed)==S_OK);
if(bValue)
{
HGLOBAL hData = GlobalLock(smed.hGlobal);
if(hData)
{
TPoint point(pt.x,pt.y);
::ScreenToClient(_OwnerControl->Handle,&point);
_FProcessText(this,(char*)hData,KeyState,point);
GlobalUnlock(hData);
GlobalFree(hData);
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了