1

这是此处回答的问题的后续问题: How to detect a mouse_down on a Userform Frame while the mouse is still down

使用该问题的答案中的代码,我可以成功检测表单上任何框架上的 MouseDown、MouseUp 和 MouseMove。但是,cls 中显然没有 Frame_Enter 或 Frame_Exit 事件。有没有办法在类模块中模拟 Frame_Enter 事件?

编辑:这就是我想要做的。我有 8 帧加载了 8 张图片,当它们组合在一个更大的帧中时,就构成了一张更大的图片。想象一个有 8 个矩形块的拼图。通常,所有 8 帧都包含其图片的“变暗”(中性滤镜覆盖)版本,但是当鼠标进入其中任何一个时,它会触发在新输入的帧中加载“未变暗”版本的图片,并且变暗刚刚退出的帧中的图片版本。因此,如果鼠标在这些帧中的任何一个上,它总是在被暗色图片包围的明亮图片上移动。

当鼠标在一个未变暗的框架上移动时,它会在无限数量的“热点”触发器上滚动,这些触发器会导致一个文本框弹出,其中包含有关鼠标当前悬停的更多信息。当它离开那个框架并移到另一个框架上时,这个过程会重复。

除了检测鼠标何时越过帧边界并进入下一帧之外,一切正常。必须在处理任何 MouseMove 事件之前检测到这一点。

如果没有其他建议,这是一种看起来很有希望的方法: http ://www.mrexcel.com/forum/showpost.php?p=2567141&postcount=28

Edit2:它看起来仍然很有希望,但我无法让它发挥作用。直到我单击控件之后,它似乎才发出进入和退出事件,这对我没有用。

所以克里斯,回到你的。您正在观看 Frame_MouseMove 事件并等待与上次不同的 Frame 发出事件。我想知道是否不使用辅助文本框来表示更改,是否可以不使用静态变量来跟踪 currentFrame/prevFrame?

4

2 回答 2

0

我可能是错的,但是没有直接的方法可以捕获帧的_Enterand_Exit事件。但是有一个替代方案

Option Explicit

Dim temp As String

Private Sub UserForm_Initialize()
    temp = "OnForm"
End Sub

Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If temp = "OnForm" Then
        Debug.Print "The mouse just entered the frame"
        temp = "OnFrame"
    End If
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If temp = "OnFrame" Then
        Debug.Print "The mouse just exited the frame"
        temp = "OnForm"
    End If
End Sub
于 2012-04-15T22:21:22.670 回答
0

关键词:模拟

使用框架Mouse_Move和表格的组合Mouse_Move

使用名为txtWhereAmI(initialise Value proiperty to Form)
txtEntry txtExit(initialise Value proiperties to 0)的文本框进行演示

在 Class 模块中声明 Frame MouseMove

Private Sub Frme_MouseMove( _
 ByVal Button As Integer, _
 ByVal Shift As Integer, _
 ByVal X As Single, _
 ByVal Y As Single)

    UserForm1.txtWhereAmI.Value = Frme.Caption
End Sub

在表单模块中声明表单鼠标移动

Private Sub UserForm_MouseMove( _
  ByVal Button As Integer, _
  ByVal Shift As Integer, _
  ByVal X As Single, _
  ByVal Y As Single)
    txtWhereAmI.Value = "Form"
End Sub

和文本框更改事件

Private Sub txtWhereAmI_Change()
    If txtWhereAmI.Value = "Form" Then
        txtExit = txtExit + 1
    Else
        txtEntry = txtEntry + 1
    End If
End Sub

结果:txtWhereAmI识别鼠标在哪一帧,txtEntry统计txtExit进入和退出事件

then的Change事件txtWhereAmI构成了您EntryExit事件处理程序的基础

于 2012-04-16T00:58:07.603 回答