MouseEvent.DragState 属性 (Visio)

返回有关与鼠标拖放形状相关的鼠标移动状态的信息。 此为只读属性。

语法

expressionDragState

表达 返回 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 ) ,其中包含触发的事件的名称和事件代码,包括拖动状态扩展以及触发事件的位置的 xy 值 ,这些值派生自 MouseEvent.XMouseEvent.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 支持和反馈,获取有关如何接收支持和提供反馈的指南。