以前发的一篇关于OLE拖拽的内容,现在复制过来

本文详细介绍了OLE拖拽技术中的核心接口IDropTarget的实现方式,包括如何注册和注销拖拽事件处理对象,以及如何通过IDataObject接口获取拖拽数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[OLE拖拽]

与OLE拖拽相关的接口有很多如下:

IDataObject:此接口主要负责数据处理行为,在OLE拖拽的源实现该接口以定义数据传输格式。在OLE拖拽的目的对象中,可以获取IDataObject接口,并且通过该接口的GetData方法获取数据。具体信息下面介绍。

IDropSource:此接口定义了一些方法来处理拖拽的界面显示。(是否如此还有待考证)

IDropTarget:此接口定义了接收OLE拖拽将要实现的方法。接收OLE拖拽的对象必须实现该接口。




--------------------------------------------------------------------------------

我现在主要是要响应OLE拖拽,所以先从IDropTarget说起。

要能够响应OLE拖拽首先要实现IDropTarget接口,并把该接口注册到要响应OLE拖拽的窗口。例如有对象如下:
  TDropManager = class(TInterfacedObject, IDropTarget) 
  private
    FOwner: TWinControl; 
    FHandle: HWND;
    FTarget: Pointer;
  public 
    constructor Create(AOwner: TWinControl);
    destructor Destroy; override;
    function DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
    function DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
    function DragLeave: HResult; stdcall;
    function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
  end;
该对象实现了IDropTarget,就可以创建该对象了。在Create方法中写入如下代码:
constructor TpsDragDropManager.Create(AOwner: TWinControl);
begin
  inherited Create;
  FOwner := AOwner;
  FHandle := AOwner.Handle;
  OleCheck(RegisterDragDrop(FHandle, Self));
end;
其中RegisterDragDrop就是把支持IDropTarget接口的对象注册为FHandle所指的窗口的用于处理OLE拖拽的对象。由程序可知,此对象的父窗口就可以获取OLE拖拽事件了,这些事件是在DragEnter,DragOver,DragLeave和Drop中触发的。理所当然的,你还需要在该对象释放的时候取消注册。也就是在析构函数中调用RevokeDragDrop(FHandle);注意, RegisterDragDrop和RevokeDragDrop不一定要放在构造函数中,它们可以放在任何地方。

[重要说明:这里进行OLE调用,因此必须初始化,使用OleInitialize(nil)和OleUninitialize函数。我是在此单元的initialization和finalization部分分别使用这两个函数(注意,我指Delphi中)] 
<另一点说明,在DragEnter中,Result := S_OK事件才会继续传递到DragOver,DragLeave等>

在DragEnter,DragOver和Drop函数中都有const dataObj: IDataObject参数,这个接口就是把数据传递进来的接口。可以调用该接口的GetData方法获取OLE拖拽的数据。GetData的声明如下:function GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult; stdcall; 它需要2个参数。其中formatetcIn函数指明了能够响应的拖拽数据类型。medium参数存放有具体数据信息。
如:
const
  HDropFormatEtc: TFormatEtc = (cfFormat: CF_HDROP; ptd: nil; dwAspect: DVASPECT_CONTENT;
    lindex: - 1; tymed: $FFFFFFFF);
  HDropFormatEtc1: TFormatEtc = (cfFormat: CF_TEXT; ptd: nil; dwAspect: DVASPECT_CONTENT;
    lindex: - 1; tymed: $FFFFFFFF);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值