外部托拽文件时,在目标区域改变光标图像,实现部分区域可以拖放。

 UnitTMyDropTarget.h文件代码

 

// ---------------------------------------------------------------------------

#ifndef UnitTMyDropTargetH
#define  UnitTMyDropTargetH
// ---------------------------------------------------------------------------
#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 *OnDragOver)(void= { read=_FOnDragOver, write=_FOnDragOver };
    
//
    __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(
voidreturn ++_iRefCount; }
    ULONG __stdcall Release(
voidif(--_iRefCount==0){delete this;} return _iRefCount; }
    HRESULT __stdcall DragEnter(IDataObject 
*pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
// –{•¶?Ž© C++Builder Œ¤‹† - http://www.ccrun.com/article.asp?i=490&d=4775gq
    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 *_FOnDragOver)(void);
    
//
    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);
}
;
// ---------------------------------------------------------------------------
#endif

UnitTMyDropTarget.cpp代码

 

// ---------------------------------------------------------------------------


#pragma  hdrstop

#include 
" UnitTMyDropTarget.h "

// ---------------------------------------------------------------------------

#pragma  package(smart_init)
// ---------------------------------------------------------------------------
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)
{
    
if(pt.x > 300)
        pdwEffect 
= 0;
    FDataFormatOK(grfKeyState,pt,
*pdwEffect);
    
if(_FOnDragOver){
        _FOnDragOver();
    }

    
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;
    dpe 
= bOK?DROPEFFECT_COPY: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);
            }

        }

    }

}

// ---------------------------------------------------------------------------

 

 Unit1.h

 

// ---------------------------------------------------------------------------

#ifndef Unit1H
#define  Unit1H
// ---------------------------------------------------------------------------
#include  < Classes.hpp >
#include 
< Controls.hpp >
#include 
< StdCtrls.hpp >
#include 
< Forms.hpp >
#include 
" UnitTMyDropTarget.h "
// ---------------------------------------------------------------------------
class  TForm1 :  public  TForm
{
__published:    
// IDE-managed Components
    TMemo *Memo1;
private:    // User declarations
    TMyDropTarget *DropMemo1; //Ž©’è?“I?•ú–Ú??
    HCURSOR hCursor;
    
bool DropEnable;
    
void __fastcall DropMemo1Text(IDropTarget *Sender, AnsiString AText, DWORD KeyState, TPoint pt); //?•úŽ–Œ 
    void __fastcall DragOverCursor(void);
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    __fastcall 
~TForm1();
}
;
// ---------------------------------------------------------------------------
extern  PACKAGE TForm1  * Form1;
// ---------------------------------------------------------------------------
#endif

Unit1.cpp

 

// ---------------------------------------------------------------------------

#include 
< vcl.h >
#pragma  hdrstop

#include 
" Unit1.h "
#include 
" winuser.h "
// ---------------------------------------------------------------------------
#pragma  package(smart_init)
#pragma  resource "*.dfm"
TForm1 
* Form1;
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent *  Owner)
    : TForm(Owner)
{
    OleInitialize(NULL);
    DropMemo1 
= new TMyDropTarget(Memo1);
    DropMemo1
->OnProcessText = DropMemo1Text;
    
//
    DropMemo1->OnDragOver = DragOverCursor;
    
//
    hCursor = LoadCursor(HInstance,"IDC_ARROW");
    DropEnable 
= true;
}

// ---------------------------------------------------------------------------
__fastcall TForm1:: ~ TForm1()
{
    DropMemo1
->Release();//delete DropMemo1;
    OleUninitialize();
}

// ---------------------------------------------------------------------------
void  __fastcall TForm1::DropMemo1Text(IDropTarget  * Sender, AnsiString AText, DWORD KeyState, TPoint pt)
{
    POINTS p
={pt.x,pt.y};
    
*(long*)&p=SendMessage(Memo1->Handle,EM_CHARFROMPOS,0,*(long*)&p);
    Memo1
->SelStart = p.x;
    Memo1
->SelLength = 0;
    Memo1
->SelText = AText;
}

// ---------------------------------------------------------------------------
void  __fastcall TForm1::DragOverCursor()
{
    
//::SetCursor(hCursor);
    /*
    RevokeDragDrop(Memo1->Handle);
    DropMemo1 = new TMyDropTarget(Memo1);
    DropMemo1->OnProcessText = DropMemo1Text ;
    
*/

}

// ---------------------------------------------------------------------------

 

 心得以后补上,关键是修改TMyDropTarget::DragOver中pdwEffect的值为0 便可部分区域不能拖拽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值