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(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);
// –{•¶?Ž© 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
#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(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);
// –{•¶?Ž© 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);
}
}
}
}
// ---------------------------------------------------------------------------
#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
#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 ;
*/
}
// ---------------------------------------------------------------------------
#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 便可部分区域不能拖拽。