首页 > 解决方案 > 在 ActiveX 复选框上使用 MouseMove 创建工具提示

问题描述

我正在尝试在我的 Excel 电子表格上的 ActiveX 复选框上显示工具提示。

下面的代码确实显示和隐藏了工具提示,但并不像预期的那样。如果您将鼠标移动到复选框上的速度过快,则工具提示(标签)将保留在工作表上。

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

With sht
     If .lblTooltip.Visible = False Then
          .lblTooltip.Visible = True
     ElseIf .lblTooltip.Visible = True Then
          .lblTooltip.Visible = False
     End If
End With

为了使上面的代码工作,如果有类似的东西:

If mousehovers for 1 second Then display the tooltip

有没有办法检查鼠标停留在控件上的时间?

还有另一种方法可以做到这一点吗?

标签: vbaexceltooltip

解决方案


您可以为此做一些非常棘手的事情,因此您可以在下面找到具体答案的起点。

直接回答问题

在您的模块之上,您声明获取鼠标坐标的 Microsoft API:

Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

注意:如果您使用的是 32 位系统,请PtrSafe从声明中删除关键字。此外,在模块顶部,您添加此类型:

Type POINTAPI
   Xcoord As Long
   Ycoord As Long
End Type

因此,在您的宏chkPrice_MouseMove中,您可以执行以下操作:

  • 触发宏时,获取鼠标坐标
  • 等一会儿,说半秒
  • 因此,再次获取鼠标坐标。如果它们与以前相同,则意味着用户将鼠标保持在同一点上,以便您可以触发事件。

在代码中:

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

Dim llCoordBefore As POINTAPI
Dim llCoordAfter As POINTAPI

GetCursorPos llCoordBefore '<-- get first time
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now())+0.5)
GetCursorPos llCoordAfter '<-- get second time

If llCoordBefore.Xcoord = llCoordAfter.Xcoord And llCordBefore.Ycoord = llCoordAfter.Ycoord Then '<-- compare

    With sht
         If .lblTooltip.Visible = False Then
              .lblTooltip.Visible = True
         ElseIf .lblTooltip.Visible = True Then
              .lblTooltip.Visible = False
         End If
    End With
End If

为什么我不会使用这个

我认为最好的办法是将 ActiveX 控件放在用户不会误悬停的地方。

您的代码在鼠标悬停时表示:

1)如果工具提示不可见,则使其可见 2)如果工具提示可见,则将其隐藏

如果用户快速通过控件,并且工具提示是隐藏的,那么它应该会显示出来并且不会隐藏。用户应将控件传回以使其再次隐藏。

无论如何,以下是您考虑的上述方法不是我推荐的一些原因:

  • 应用程序将等待 X 秒。如果用户错误地悬停,他会让他的 Excel 等待 X 秒,然后才能再次控制。就用户体验而言,这可能很烦人。
  • API 以非常敏感的方式获取坐标。您将需要实现一个近似值(在我的示例中,只有当悬停前后的坐标完全相同时,我才会继续;但是,在现实生活中,您需要留出一些余量,因为鼠标可能会在第一次和第二次获取坐标)。

推荐阅读