创建ActiveX的复选框使用的MouseMove工具提示(Create Tooltip using

2019-10-28 16:20发布

我试图得到一个提示对我的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

有没有一种方法来检查的时间量的鼠标仍然在控制?

是否有另一种方式做到这一点?

Answer 1:

也有一些是相当棘手,你可以为做的,所以下面你可以找到适合您的具体回答的起点。

直接回答问题

在您的模块的顶部,你声明的微软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秒之前,他可以再次取得控制权。 它可能在UX方面是恼人。
  • 该API获取一个非常敏感的方式坐标。 你将需要实现一个近似值(在我的例子中,我只继续如果坐标之前和之后悬停一模一样的;但是,在现实生活中,你将需要留有一定的余量导致鼠标可能之间轻微移动第一和坐标的第二GET)。


Answer 2:

使用Application.OnTime隐藏在复选框鼠标移动后的标签1秒。

公共代码模块

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

工作表代码模式

Private Sub chkPrice_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If X > 0 And X < chkPrice.Top - chkPrice.Height Then
        ShowTootTip
        CheckBoxHasFocus = True
    Else
        CheckBoxHasFocus = False
    End If
End Sub


文章来源: Create Tooltip using MouseMove on ActiveX Checkbox