国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 05:37:06
字體:
來源:轉載
供稿:網友

  原作者:Victor Chen
來 源:C++ 愛好者
網址: http://www.cppfans.com/
Email: victor@cppfans.com

需要用 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 房山区| 新邵县| 博罗县| 富蕴县| 浮山县| 交口县| 莱西市| 宁城县| 孙吴县| 宝兴县| 措勤县| 郸城县| 安塞县| 开原市| 绩溪县| 夏邑县| 阳谷县| 彭泽县| 临澧县| 肇庆市| 辉县市| 乌拉特后旗| 朝阳县| 汉中市| 康马县| 灌阳县| 宜黄县| 江安县| 嫩江县| 新沂市| 双牌县| 汕尾市| 河南省| 科技| 文成县| 珲春市| 武义县| 大埔县| 武鸣县| 正安县| 离岛区|