程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 把其它程序(如網頁等)的文字拖放到Memo裡

把其它程序(如網頁等)的文字拖放到Memo裡

編輯:C語言基礎知識
  原作者:Victor Chen
   來 源:C++ 愛好者
   網址: http://www.cppfans.com/
   Email: [email protected]
  
   需要用 COM 接口的 OLE 拖放目標, 程序新建一個支持拖放目標的UnitTMyDropTarget 單元, 在這個單元裡創建一個 TMyDropTarget 類。
   這個程序可以使從寫字板或者網頁等定義的文本塊用鼠標拖動, 放到程序的 Memo 裡, 插入到 Memo 的拖放的位置。
  
   首先看看如何使用這個 TMyDropTarget 類:
   在 Form 的頭文件裡 (例如 Unit1.h) 需要增加的內容(藍色部分是新增內容):
   #include "UnitTMyDropTarget.h"
  
   class TForm1 : public TForm
   {
   private: // User declarations
       TMyDropTarget *DropMemo1; //自定義的拖放目標類
       void __fastcall DropMemo1Text(IDropTarget *Sender, AnsiString AText, DWord KeyState, TPoint pt); //拖放事件
   public: // User declarations
       __fastcall TForm1(TComponent* Owner);
       __fastcall ~TForm1();
   };
  
   在 From 的 .cpp 文件裡 (例如 Unit1.cpp), 需要增加的內容(藍色部分是新增內容):
  
   __fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
   {
       OleInitialize(NULL);
       DropMemo1 = new TMyDropTarget(Memo1);
       DropMemo1->OnProcessText = DropMemo1Text;
   }
   //---------------------------------------------------------------------------
   __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;
   }
   //---------------------------------------------------------------------------
  
   TMyDropTarget 類的實現:
   頭文件 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 *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);
   };
   //---------------------------------------------------------------------------
   #endif
   //---------------------------------------------------------------------------
  
   UnitTMyDropTarget.cpp 的內容:
   //---------------------------------------------------------------------------
   #include "UnitTMyDropTarget.h"
   //---------------------------------------------------------------------------
   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)
   {
   &n
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved