将 OLE 拖动源拖到 OLE 拖放目标的上方

使用手工目标,可判断目标中源数据的位置并对其作出响应,还可对鼠标按钮及 SHIFT、CTRL、ALT 键的状态作出响应。源与目标均为手工时可修改缺省的鼠标视觉性能。

为了 . . . 使用 . . .
判断并响应源对象的位置 OLEDragOver 事件的 state 参数
响应鼠标按钮的状态 OLEDragDrop 和 OLEDragOver 事件的 button 参数
响应 SHIFT、CTRL 及 ALT 键的状态 OLEDragDrop 和 OLEDragOver 事件的 shift 参数
修改缺省的鼠标视觉性能 OLEDragOver 事件的 effect 参数和OLEGiveFeedback事件的 effect 参数

详细信息 关于改变鼠标光标的详细信息,请参阅“将 OLE 拖动源拖到 OLE 拖放目标的上方”。关于使用 buttonshift 参数的详细信息,请参阅“使用鼠标与键盘修改放下效果和用户反馈”。

OLEDragOver 事件状态参数

根据位置的不同,effect 参数可能会相应变化,以指示当前可接受的拖放效果。

有了 OLEDragOver 事件中的 state 参数,就可对数据进入、经过以及离开目标控件诸状态作出响应。例如,当源数据进入目标控件时,将 state 参数设置为 vbEnter。

在放下目标边界内移动拖动源时将 state 参数设置为 vbOver。有时希望根据鼠标指针的位置(xy 参数)的不同改变拖动效果。注意,每秒都会数次生成 OLEDragOver 事件,就是在鼠标静止时也不例外。

通过使用下列常数,用 OLEDragOver 事件中的 state 参数指定数据何时进入、经过和离开目标:

常数 意义
VbEnter 0 已将数据拖入目标的范围。
VbLeave 1 已将数据拖出目标的范围。
VbOver 2 数据仍在目标的范围内,而且移动了鼠标或者改变了鼠标按钮或键盘的状态,或者消耗了一段由系统决定的时间。

向用户提供自定义的视觉反馈

若希望改变 OLE 拖放操作中缺省的鼠标视觉性能,可在目标端操作 OLEDragOver 事件并在源端操作 OLEGiveFeedback 事件。

在拖放操作期间,OLE 拖放提供自动视觉反馈。例如在开始拖动时,鼠标指针将发生变化,指出已开始拖动。当经过不支持 OLE 放下的对象时,鼠标指针将变成“不放下”光标。

当把数据放到某个控件时,改变鼠标指针以指出控件如何响应,这将涉及两个步骤:用 GetFormat 方法判断 DataObject 对象中的数据类型,然后设置 OLEDragOver 事件的 effect 参数以通知源,此控件允许何种放下效果。

OLEDragOver 事件

在把目标控件的 OLEDropMode 属性设置为“手工”时,拖动数据无论何时经过此控件即触发 OLEDragOver 事件。

如果放下了对象,则用 OLEDragOver 事件的 effect 参数指定执行的操作。设置此值时将触发源的 OLEGiveFeedback 事件。OLEGiveFeedback 事件包含其自身的 effect 参数,用此参数向用户提供视觉反馈,当拖动选定时,依据此反馈执行操作─ 也就是说,将改变鼠标指针以指示复制、移动,或“不放下”操作。

OLEDragOver 事件的 effect 参数使用下列常数指示放下操作:

常数 描述
VbDropEffectNone 0 放下目标无法接受数据。
VbDropEffectCopy 1 放下结果为复制。拖动源未改变原始数据。
VbDropEffectMove 2 拖动源删除了数据。

注意 OLEDragOver 与 OLEGiveFeedback 事件的 effect 参数表示的放效果(复制、移动及不放下)与 OLEStartDrag 事件的 allowedeffects 参数表示的放效果相同。区别仅在于,OLEStartDrag 事件指定允许的效果,而 OLEDragOver 和 OLEGiveFeedback 用 effect 参数通知源将执行哪一个操作。

下列代码向 DataObject 对象查询与目标控件兼容的数据格式。如果数据兼容,则 effect 参数通知源,如果放下数据,则将执行移动操作。如果数据不兼容,则也将通知源并显示一个“不放下”鼠标指针。

Private Sub txtTarget_OLEDragOver(Data As _ 
      VB.DataObject, Effect As Long, Button As _
      Integer, Shift As Integer, X As Single, _
      Y As Single, State As Integer)
   If Data.GetFormat(vbCFText) Then
      Effect = vbDropEffectMove And Effect
   Else
      Effect = vbDropEffectNone
   End If
End Sub

在拖动源数据经过目标并触发 OLEDragOver 事件时,源将告诉目标,它允许什么效果(移动、复制及不放下)。此后,必须选择唯一效果。OLEDragOver 事件的 effect 参数通知源,它支持哪一个放下操作,然后,源又用 OLEGiveFeedback 事件改变鼠标指针,以此方式通知用户。

OLEGiveFeedback 事件

为了根据 OLEDragOver 事件的 effect 参数改变鼠标指针的缺省性能,需用 OLEGiveFeedback 事件手工指定新的鼠标指针值。设置 OLEDragOver 事件的 effect 参数时将会自动触发源的 OLEGiveFeedback 事件。

OLEGiveFeedback 事件包含两个参数 (effectdefaultcursors),使用它们即可改变 OLE 拖放操作中的缺省鼠标指针。

effect 参数象其它 OLE 拖放事件一样,指出是复制、移动还是拒绝数据。但是,在 OLEGiveFeedback 事件中,这个参数意在通过改变鼠标指针来指出操作类型,从而向用户提供自定义的视觉反馈。

常数 描述
VbDropEffectNone 0 放下目标无法接受数据。
VbDropEffectCopy 1 放下的结果是复制操作。拖动源未改变原始数据。
VbDropEffectMove 2 拖动源移动数据。
VbDropEffectScroll &H80000000& 即将启动滚动或正在目标内滚动。除使用其它值外还使用此数值。

注意 某些应用程序或控件可用 vbDropEffectScroll 值指示用户把鼠标移动到应用程序窗口边缘处,从而造成滚动。某些(而非全部)Visual Basic 标准控件自动支持滚动。如果将数据拖动到包含滚动条的程序中,例如拖动到 Word for Windows 中,则需编程控制滚动效果。

defaultcursors 参数指示是否使用缺省的 OLE 光标集合。将此参数设置为 False 就可用 Screen 对象的 Screen.MousePointer 属性指定自己的光标。

对大多数情况无需指定自定义鼠标指针,因为 OLE 处理鼠标的缺省性能。如果决定用 OLEGiveFeedback 事件指定自定义鼠标指针,则需考虑每个可能的效果,包括滚动效果。创建选项,使当遇到未知效果时仍回过头来让 OLE 控制鼠标指针,由此可能会增添一些效果,对这些效果进行编程是非常可取的。

以下代码示例设置了 effectdefaultcursors 参数,并且通过设置 Screen 对象的 MousePointer 和 MouseIcon 属性为复制、移动和滚动效果指定了自定义光标(.ico 或 .cur 文件)。如果遇到未知效果,代码还会回过头来让 OLE 控制鼠标指针。

Private Sub TxtSource_OLEGiveFeedback(Effect As Long, _ 
      DefaultCursors As Boolean)
   DefaultCursors = False
   If Effect = vbDropEffectNone Then
      Screen.MousePointer = vbNoDrop
   ElseIf Effect = vbDropEffectCopy Then
      Screen.MousePointer = vbCustom
      Screen.MouseIcon = LoadPicture("c:\copy.ico")
   ElseIf Effect = (vbDropEffectCopy Or _
         vbDropEffectScroll) Then
      Screen.MousePointer = vbCustom
      Screen.MouseIcon = _ 
            LoadPicture("c:\copyscrl.ico")
   ElseIf Effect = vbDropEffectMove Then
      Screen.MousePointer = vbCustom
      Screen.MouseIcon = LoadPicture("c:\move.ico")
   ElseIf Effect = (vbDropEffectMove Or _
         vbDropEffectScroll) Then
      Screen.MousePointer = vbCustom
      Screen.MouseIcon = _ 
         LoadPicture("c:\movescrl.ico")
   Else
      ' 如果添加了不了解的格式,则让 OLE 用正确的缺省值去处理。
      DefaultCursors = True
   End If
End Sub

注意 如果在 OLEGiveFeedback 事件中指定了自定义的鼠标指针,则总应在 OLECompleteDrag 事件中重置鼠标指针。关于当数据被放下时如何通知源的详细信息,请参阅“在 OLE 放下目标上放下 OLE 放下源”。

详细信息 关于 MousePointer 和 MouseIcon 属性的详细信息,请参阅“自定义鼠标指针”。