在ActiveX上使用MouseMove创建工具提示复选框

时间:2018-06-26 21:26:13

标签: vba excel-vba tooltip excel

我正在尝试获取一个工具提示,以便在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

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

还有另一种方法吗?

2 个答案:

答案 0 :(得分:2)

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

直接回答问题

在模块顶部,声明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以非常敏感的方式获取坐标。您将需要实现一个近似值(在我的示例中,仅当鼠标悬停之前和之后的坐标完全相同时才进行;但是,在现实生活中,您将需要留一些裕度,因为鼠标可能会在两个鼠标之间略微移动。坐标的第一个和第二个)。

答案 1 :(得分:0)

在鼠标移至复选框上方1秒钟后,使用public class User { public int Id { get; set; } public string Username { get; set; } public byte[] PasswordHash { get; set; } public byte[] PasswordSalt { get; set; } public UserRole UserRole { get; set; } //<--- THE IMPORTANT PART ... } public class UserRole { public int Id { get; set; } public string Role { get; set; } } 隐藏标签。

enter image description here

公共代码模块

Application.OnTime

工作表代码模式

Public TootTipVisible As Boolean
Public CheckBoxHasFocus As Boolean

Public Sub ShowTootTip()
    Application.Caption = Now 'TootTipVisible & "," & CheckBoxHasFocus
    If Not TootTipVisible And Not CheckBoxHasFocus Then
        TootTipVisible = True
        Sheet1.sht.Visible = True
        Application.OnTime Now + TimeValue("00:00:01"), "HideTootTip"
    End If
End Sub

Public Sub HideTootTip()
    TootTipVisible = False
    Sheet1.sht.Visible = False
End Sub