松鼠的博客

导航

统计

实现从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);
};
复制代码

 

.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);
            }
        }
    }
}  
复制代码

posted on   Xproer-松鼠  阅读(339)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示