如果目标支持手工 OLE 拖放操作,则可在目标中移动光标时控制发生的事情并指定目标所接受数据的种类。当用户将源对象放到目标控件时,可用 OLEDragDrop 事件向 DataObject 对象查询兼容的数据格式,然后再获取数据。
OLEDragDrop 事件还将通知放下操作源某些消息,例如,如果指定移动操作则允许源删除原始数据。
将源放到目标时会触发 OLEDragDrop 事件。在启动拖动操作时,如果已将数据放到 DataObject 对象中,则可在触发 OLEDragDrop 事件时使用 GetData 方法获取数据。但是,如果启动拖动操作时仅仅声明了所支持的源的格式,则 GetData 方法将自动在源触发 OLESetData 事件,此事件将数据放到 DataObject 对象中,然后再从中获取数据。
由下例可看到,在启动拖动操作时将获取放在 DataObject 对象中的数据。拖动操作可能由手工启动(在源使用 OLEDrag 方法),也可能自动启动(通过将源的 OLEDragMode 属性设置为“自动化”)。该例中使用 DataObject 对象的 GetData 方法获取拖动的数据。GetData 方法提供了代表 DataObject 对象所支持的数据类型的常数。在这里,获取的数据是文本。
Private Sub txtTarget_OLEDragDrop(Data As _
VB.DataObject, Effect As Long, Button As _
Integer, Shift As Integer, X As Single, _
Y As Single)
txtTarget.Text = Data.GetData(vbCFText)
End Sub
详细信息 关于 GetData 格式常数的完整列表,请参阅本章前面的“OLE 拖放 DataObject 对象”。
有时可能需要向 DataObject 对象查询放到目标的数据的类型。可在 If…Then 语句中用 GetFormat 方法指定目标控件所能接受的数据类型。若 DataObject 对象中的数据兼容,则完成了放操作。
Private Sub txtTarget_OLEDragDrop(Data As _
VB.DataObject, Effect As Long, Button As _
Integer, Shift As Integer, X As Single, _
Y As Single)
If Data.GetFormat(vbCFText) Then
txtTarget.Text = Data.GetData(vbCFText)
End If
End Sub
当目标用 GetData 方法从源获取数据时,如果在启动拖动操作时未将数据放到源中,则只触发 OLESetData 事件。
在很多情况下,特别是如果源支持多种格式或者为创建数据会耗费大量时间,则可能希望仅仅在目标请求数据时才将数据放到 DataObject 对象中。OLESetData 事件使源对于一种指定的数据格式只响应一个请求。
例如,如果在启动拖动操作时用 OLEStartDrag 事件指定所支持的数据格式,但未将数据放到 DataObject 对象中,则将使用 OLESetData 事件把特定格式的数据放到 DataObject 对象中。
Private Sub txtSource_OLESetData(Data As _
VB.DataObject, DataFormat As Integer)
If DataFormat = vbCFText Then
Data.SetData txtSource.SelText, vbCfText
End If
End Sub
OLEDragDrop 事件的 effect 参数规定,在放数据时如何将数据并入目标。设置此参数后,就用设置成该值的 effect 参数在源触发 OLECompleteDrag 事件。随后,源可执行适宜的操作:例如,若指定了移动,则源将删除数据。
OLEDragDrop 事件的 effect 参数与 OLEDragOver 事件的 effect 参数使用相同的参数,以指示放操作。下表列出这些常数:
常数 | 值 | 描述 |
VbDropEffectNone | 0 | 放下目标无法接受数据。 |
VbDropEffectCopy | 1 | 放下结果为复制。拖动源未改变原始数据。 |
VbDropEffectMove | 2 | 拖动源删除数据。 |
下示例设置 effect 参数来指示放操作。
Private Sub txtTarget_OLEDragDrop(Data As _
VB.DataObject, Effect As Long, Button As _
Integer, Shift As Integer, X As Single, _
Y As Single)
If Data.GetFormat(vbCFText) Then
txtTarget.Text = Data.GetData(vbCFText)
End If
Effect = vbDropEffectMove
End Sub
在源端,当把源放到目标上或者取消了 OLE 拖放操作时将会触发 OLECompleteDrag 事件。OLECompleteDrag 是拖放操作中的最后一个事件。
OLECompleteDrag 事件只包含一个参数 (effect),这个参数被用来通知源,在将数据放到目标时执行的是什么操作。
effect 参数返回的数值与其它 OLE 拖放事件 effect 参数使用的数值相同:vbDropEffectNone, vbDropEffectCopy, and vbDropEffectMove。
例如,在目标指定了一个移动操作而源被放到目标后设置此参数,源将删除控件中的原始数据。如果在 OLEGiveFeedback 事件中指定了自定义的鼠标指针,则还应该使用 OLECompleteDrag 事件重置鼠标指针。例如:
Private Sub txtSource_OLECompleteDrag(Effect As Long)
If Effect = vbDropEffectMove Then
txtSource.SelText = ""
End If
Screen.MousePointer = vbDefault
End Sub