我试图得到一个提示对我的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
有没有一种方法来检查的时间量的鼠标仍然在控制?
是否有另一种方式做到这一点?
也有一些是相当棘手,你可以为做的,所以下面你可以找到适合您的具体回答的起点。
直接回答问题
在您的模块的顶部,你声明的微软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)。
使用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