MouseEvent.DragState 属性 (Visio)
返回有关与鼠标拖放形状相关的鼠标移动状态的信息。 此为只读属性。
语法
expression。 DragState
表达 返回 MouseEvent 对象的表达式。
返回值
Long
备注
DragState 属性通过返回有关在整个拖放操作过程中鼠标移动和操作状态的详细信息来扩展 MouseMove 事件。 将 DragState 属性与 EventList.AddAdvise 方法结合使用,以确定拖放操作是否开始,或者鼠标是进入放置目标窗口、在窗口上移动、在目标窗口中放置对象还是离开窗口。
注意
可以使用 Event.SetFilterActions 方法准确指定要侦听的拖动状态扩展。
若要处理事件通知,请创建实现 IVisEventProc 接口的 VisEventProc 方法的类模块,然后创建此类的实例,以作为参数传递给 AddAdvise 方法。 获取 VisEventProc 函数的 pSubjectObj 参数的 DragState 属性的值。
可以随时返回 VisEventProc = True 以取消拖放操作,例如,如果收到事件通知,指出用户正在尝试将对象拖放到不适当的目标窗口中。
本主题附带的示例提供了演示如何获取拖动状态信息的示例代码。
DragState 属性返回的可能值如下表所示,这些值在 VisMouseMoveDragStates 枚举中声明,该枚举则在 Microsoft Visio 类型库中声明。
常量 | 值 | Description |
---|---|---|
visMouseMoveDragStatesBegin | 1 | 用户开始使用鼠标拖动对象。 |
visMouseMoveDragStatesDrop | 5 | 用户已将拖动的对象放置在拖放目标窗口中。 |
visMouseMoveDragStatesEnter | 2 | 用户正在使用鼠标将对象拖放到目标窗口中。 |
visMouseMoveDragStatesLeave | 4 | 用户正在将鼠标移出下拉目标窗口。 |
visMouseMoveDragStatesNone | 0 | 没有鼠标移动,或是鼠标移动没有拖动操作。 |
visMouseMoveDragStatesOver | 3 | 用户正在使用鼠标在拖放目标窗口中移动拖放对象。 |
当 DragState 属性返回 visMouseMoveDragStatesBegin 时,表示开始拖放操作。 对于每一个拖放操作,DragState 属性只返回一次 visMouseMoveDragStatesBegin。 此时,可以完全取消拖放操作;如果这样做,Visio 不会为任何目标窗口触发其他 MouseMove 事件。
当 DragState 属性返回 visMouseMoveDragStatesEnter 时,最终用户将对象拖动到放置目标窗口中。 该事件对每个拖放目标窗口触发一次。 此时,可以取消该特定放置目标窗口的拖放操作。
当 DragState 属性返回 visMouseMoveDragStatesOver 时,表示用户正在将对象拖放到目标窗口上。 可以根据代码中指定的窗口类型或窗口中的 x,y 范围取消拖动操作。 取消拖放目标窗口上的拖动操作会阻止最终用户完成拖放操作。
当 DragState 属性返回 visMouseMoveDragStatesDrop 时,放置目标窗口正在接收放置。 您可以取消该放置操作,以阻止放置操作发生。 如果发生这种情况,并且你不取消在放置目标窗口上的拖动操作,则最终用户不会获得任何视觉反馈来指示放置操作已被阻止。
当 DragState 属性返回 visMouseMoveDragStatesLeave 时,表示最终用户正在将鼠标移出拖放目标窗口之外。 此时无法取消此操作,但也没有逻辑理由执行此操作。
示例
本示例显示如何创建实现 IVisEventProc 接口的类模块,以处理由 MouseEvent 对象触发的事件。 该模块由 VisEventProc 函数组成,它使用 Select Case 块来确定触发的事件是否为 MouseMove 事件。 如果是,该代码将使用 If...Else 块和 DragState 属性来确定触发的特定 MouseMove 事件扩展。
除 MouseMove 之外的事件都属于默认情况 (Case Else)。 在这两种情况下, Case 块构造一个字符串 ( strMessage ) ,其中包含触发的事件的名称和事件代码,包括拖动状态扩展以及触发事件的位置的 x 和 y 值 ,这些值派生自 MouseEvent.X 和 MouseEvent.Y 属性的值。 最后,该函数在“即时”窗口中显示这一消息。
将这段示例代码复制到 VBA 或 Visual Basic 中新的类模块中,并将该模块命名为 clsEventSink。 之后,就可以使用随后的事件接收模块创建 clsEventSink 类的一个实例,并为向该类实例发送事件触发通知的 MouseMove 事件创建一个 Event 对象。
Implements Visio.IVisEventProc
'Declare visEvtAdd as a 2-byte value
'to avoid a run-time overflow error
Private Const visEvtAdd% = &H8000
Private Function IVisEventProc_VisEventProc( _
ByVal nEventCode As Integer, _
ByVal pSourceObj As Object, _
ByVal nEventID As Long, _
ByVal nEventSeqNum As Long, _
ByVal pSubjectObj As Object, _
ByVal vMoreInfo As Variant) As Variant
Dim strMessage As String
'Find out which event and event extension fired
Select Case nEventCode
Case visEvtCodeMouseMove
Dim strInfo As String
If (pSubjectObj.DragState = visMouseMoveDragStatesOver) Then
strMessage = "MouseMove - dragOver (" + Str(pSubjectObj.x) + "," + Str(pSubjectObj.y) + ")"
ElseIf (pSubjectObj.DragState = visMouseMoveDragStatesBegin) Then
strMessage = "MouseMove - dragBegin (" + Str(pSubjectObj.x) + "," + Str(pSubjectObj.y) + ")"
If (pSubjectObj.Window.Index <> 1) Then
IVisEventProc_VisEventProc = True ' cancel for all windows except first one
End If
ElseIf (pSubjectObj.DragState = visMouseMoveDragStatesLeave) Then
strMessage = "MouseMove - dragLeave"
ElseIf (pSubjectObj.DragState = visMouseMoveDragStatesEnter) Then
strMessage = "MouseMove - dragEnter*******************************************"
ElseIf (pSubjectObj.DragState = visMouseMoveDragStatesDrop) Then
strMessage = "MouseMove - dragDrop"
End If
Case Else
strMessage = "Other (" & nEventCode & ")"
End Select
'Display the event name and the event code
If (Len(strMessage)) Then
Debug.Print strMessage
End If
End Function
下面的 VBA 模块说明如何使用 AddAdvise 方法来接收事件。 该模块包含两个公共过程。
CreateEventObjects 过程创建名为 clsEventSink 的接收对象(事件处理)类的一个实例,该实例传递给 AddAdvise 方法并接收事件通知。 另外,该过程还创建一个 Event 对象,该对象将源自 Application 对象的 MouseMove 事件的触发通知发送到接收对象。
Initialize 过程调用 CreateEventObjects 过程,以开始侦听事件。
clsEventSink 类实现 IVisEventProc 接口。
Public Sub Initialize()
CreateEventObjects
End Sub
Option Explicit
Private mEventSink As clsEventSink
Dim vsoApplicationEvents As Visio.EventList
Dim vsoMouseMoveEvent As Visio.Event
'Declare visEvtAdd as a 2-byte value
'to avoid a run-time overflow error
Private Const visEvtAdd% = &H8000
Public Sub CreateEventObjects()
'Create an instance of the clsEventSink class
'to pass to the AddAdvise method.
Set mEventSink = New clsEventSink
'Get the EventList collection of the current instance of the Visio Application object
Set vsoApplicationEvents = Application.EventList
'Add an Event object that sends notifications of the MouseMove event.
Set vsoMouseMoveEvent = vsoApplicationEvents.AddAdvise(visEvtCodeMouseMove, mEventSink, "", "Mouse moved...")
End Sub
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。