使用手工目标,可判断目标中源数据的位置并对其作出响应,还可对鼠标按钮及 SHIFT、CTRL、ALT 键的状态作出响应。源与目标均为手工时可修改缺省的鼠标视觉性能。
为了 . . . | 使用 . . . |
判断并响应源对象的位置 | OLEDragOver 事件的 state 参数 |
响应鼠标按钮的状态 | OLEDragDrop 和 OLEDragOver 事件的 button 参数 |
响应 SHIFT、CTRL 及 ALT 键的状态 | OLEDragDrop 和 OLEDragOver 事件的 shift 参数 |
修改缺省的鼠标视觉性能 | OLEDragOver 事件的 effect 参数和OLEGiveFeedback事件的 effect 参数 |
详细信息 关于改变鼠标光标的详细信息,请参阅“将 OLE 拖动源拖到 OLE 拖放目标的上方”。关于使用 button 与 shift 参数的详细信息,请参阅“使用鼠标与键盘修改放下效果和用户反馈”。
根据位置的不同,effect 参数可能会相应变化,以指示当前可接受的拖放效果。
有了 OLEDragOver 事件中的 state 参数,就可对数据进入、经过以及离开目标控件诸状态作出响应。例如,当源数据进入目标控件时,将 state 参数设置为 vbEnter。
在放下目标边界内移动拖动源时将 state 参数设置为 vbOver。有时希望根据鼠标指针的位置(x 和 y 参数)的不同改变拖动效果。注意,每秒都会数次生成 OLEDragOver 事件,就是在鼠标静止时也不例外。
通过使用下列常数,用 OLEDragOver 事件中的 state 参数指定数据何时进入、经过和离开目标:
常数 | 值 | 意义 |
VbEnter | 0 | 已将数据拖入目标的范围。 |
VbLeave | 1 | 已将数据拖出目标的范围。 |
VbOver | 2 | 数据仍在目标的范围内,而且移动了鼠标或者改变了鼠标按钮或键盘的状态,或者消耗了一段由系统决定的时间。 |
若希望改变 OLE 拖放操作中缺省的鼠标视觉性能,可在目标端操作 OLEDragOver 事件并在源端操作 OLEGiveFeedback 事件。
在拖放操作期间,OLE 拖放提供自动视觉反馈。例如在开始拖动时,鼠标指针将发生变化,指出已开始拖动。当经过不支持 OLE 放下的对象时,鼠标指针将变成“不放下”光标。
当把数据放到某个控件时,改变鼠标指针以指出控件如何响应,这将涉及两个步骤:用 GetFormat 方法判断 DataObject 对象中的数据类型,然后设置 OLEDragOver 事件的 effect 参数以通知源,此控件允许何种放下效果。
在把目标控件的 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 事件改变鼠标指针,以此方式通知用户。
为了根据 OLEDragOver 事件的 effect 参数改变鼠标指针的缺省性能,需用 OLEGiveFeedback 事件手工指定新的鼠标指针值。设置 OLEDragOver 事件的 effect 参数时将会自动触发源的 OLEGiveFeedback 事件。
OLEGiveFeedback 事件包含两个参数 (effect 和 defaultcursors),使用它们即可改变 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 控制鼠标指针,由此可能会增添一些效果,对这些效果进行编程是非常可取的。
以下代码示例设置了 effect 和 defaultcursors 参数,并且通过设置 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 属性的详细信息,请参阅“自定义鼠标指针”。