使用OLE拖放不同程序间的数据[转]

 


OLE Drag and Drop

难度:★★★☆☆

先行知识:Delphi / 接口 / Win32 / OLE or COM

 

从一个程序拖动数据到另一个程序(典型的情况是拖动文本)已经不是什么新鲜事了,很多共享软件都支持这个功能(比如说著名的flashgetnetants等的浮动窗口功能)。作者一直想在自己的软件中实现这个功能,经过一段时间的资料搜索,有了部分的了解,但这些文档大多数使用C++描述。于是,好东西(也算不上好好的吧J)不敢独享,经过整理我将自己用delphi的实现方法写出来,并简单的讲解一下OLE Drag and Drop机制。

所谓OLE Drag and Drop不用翻译大家一看就能知道它的意思了,它使不同的程序(或同一个程序)通过相互拖动数据来进行交互成为可能。 在这方面windows为我们在后面做了很复杂的工作,幸运的是我们不用担心它的复杂性,windows已经为我们提供了两个相当关键的接口:IDropSourceIDropTarget我们只用实现这两个接口便可以方便的实现OLE Drag and Drop,前者由允许拖放自己数据的数据源程序实现,后者由允许接收拖放数据的数据目标程序所实现。在本文中,我们只讨论后者,因为我们只希望接收来自其它程序拖放过来的数据,而前者已经被大多数程序实现了(如IEwindows帮助系统等,如果想了解更多关于IDropSource的实现请参看win32 sdk帮助文件)。

接下来我们简单的了解一下windows是怎样在后面实现数据拖放的,然后我们实现IDropTarget的一个例子程序(关于程序中的api和格式会在出现的时候给予说明)。Windows在后台调用了一个重要的DoDragDrop函数来检测接口和调用有我们实现的接口方法,下面是这个函数工作时大概的步骤:

·当我们开始向可以接收数据的窗体拖动数据时,DoDragDrop首先检查鼠标下的窗体是否被注册为可以接收的窗体(通过RegisterDragDrop api来注册,该函数有两个参数,第一个为要注册的窗体的句柄,第2个为指向我们实现IDropTarget的类的一个对象指针,在我们的窗体不需要再接收任何拖动过来的数据时使用RevokeDragDrop来解除注册,它只有一个参数,就是欲解除的窗体句柄,另外重要的一点是要成功的调用这些函数,我们必须在程序开始时使用OleInitialize(nil)在结束时调用OleUninitialize以便初始化OLE library。)

·如果窗体可以接收拖动,DoDragDrop便调用IDropTarget接口的DragEnter方法,该方法通过一个引用参数返回一个拖动的效果dwEffect

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值