vba - 在 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
有没有办法检查鼠标停留在控件上的时间?
还有另一种方法可以做到这一点吗?
解决方案
您可以为此做一些非常棘手的事情,因此您可以在下面找到具体答案的起点。
直接回答问题
在您的模块之上,您声明获取鼠标坐标的 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 以非常敏感的方式获取坐标。您将需要实现一个近似值(在我的示例中,只有当悬停前后的坐标完全相同时,我才会继续;但是,在现实生活中,您需要留出一些余量,因为鼠标可能会在第一次和第二次获取坐标)。
推荐阅读
- qt - QML 更新 ListView 内 Item 的属性
- javascript - 传入组件的道具未定义
- linq - Linq 列表到字节数组
- python - Pygame KEYDOWN 箭头键导致玩家在移动过程中“卡住”
- python-3.x - 如何将自定义类的对象存储为 django 中的会话变量?
- python - 测试 django 脚本时打印语法错误
- android-source - Android AOSP make kernel menuconfig
- c++ - 无法在 Windows 凭据提供程序中使用非 ascii 字符(口音)
- java - BufferedReader 的 read(char[]) 是如何工作的?
- reactjs - 我从“分离的 HEAD”状态返回,git 从本地目录中删除了我的 .env 文件