我有一个带有列表框的表单。我试图在鼠标悬停时更新ControlTipText
。我在带有列表框(字体Calibri,字体大小12)的用户窗体后面使用以下代码。
Option Explicit
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim Position As Long
Position = Int(Y / 15)
With Me.ListBox1
.ControlTipText = vbNullString
If Position < .ListCount And Position >= 0 Then
.ControlTipText = .List(Position)
Debug.Print .List(Position), .ControlTipText
End If
End With
End Sub
Private Sub UserForm_Initialize()
With Me.ListBox1
.AddItem "Banana"
.AddItem "Potato"
.AddItem "Tomato"
End With
End Sub
问题是ControlTipText
在显示后正在更新,因此它总是落后一个位置(如果我将鼠标移到“马铃薯”上,然后移至屏幕外,然后移至“香蕉”上,{{1} }会说“土豆”。立即窗口显示正确的位置并更新了ControlTipText
,因此它似乎可以正常工作,但仅在显示ControlTipText
之后。
我已经针对ControlTipText
和ListBox
等MouseDown
进行了其他活动,但它们仅在出现点击时起作用。诸如this one之类的在线示例似乎在说,唯一的方法是单击一次更新。
是否有一种方法可以强制MouseUp
在显示之前进行更新,或者更好的是,在使用ControlTipText
事件时立即显示更新的ControlTipText
?
修改: 需求说明:用户窗体上的空间很少,要显示的文本可能很长(最多60个单词)。
答案 0 :(得分:1)
我怀疑是否存在强制实时ControlTipText
的事情。建议在您在用户窗体上某处设置的标签中显示该值。至少这将是简单的出路。
但是,您可以通过在用户窗体中自由移动的动态ControlTipText
自己制作frame
之类的东西(由于空间有限)。这是一个示例:
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim Position As Long
Position = Int(Y / 10)
If Position < UserForm1.ListBox1.ListCount And Position >= 0 Then
With Controls("TIPTEXT")
.Caption = Me.ListBox1.List(Position)
.Left = X + 75
.Width = 50
.Top = Y + 35
.Height = 10
End With
Controls("TIPTEXT").Visible = True
Else
Controls("TIPTEXT").Visible = False
End If
End Sub
Private Sub UserForm_Initialize()
Dim FRM As MSForms.Frame
With Me.ListBox1
.AddItem "Banana"
.AddItem "Potato"
.AddItem "Tomato"
.AddItem "Apples"
.AddItem "Pears"
End With
Set FRM = Me.Controls.Add("Forms.Frame.1")
With FRM
.Name = "TIPTEXT"
.BackColor = vbYellow
.Visible = False
.ZOrder (0)
End With
End Sub
结果:
看到任何人想出其他解决方案都非常有趣:)
祝你好运!