您的位置:首页 > 其它

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

2007-05-08 14:37 661 查看
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

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 便可部分区域不能拖拽。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: