代码之家  ›  专栏  ›  技术社区  ›  Victor K

在显示列表框之前更新它的ControlTipText

  •  1
  • Victor K  · 技术社区  · 7 年前

    我有一张带列表框的表格。我正在尝试更新 ControlTipText 鼠标悬停。我在带有列表框(font Calibri,font size 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
    

    问题是 控制文本 在显示后被更新,所以它总是落后一个位置(如果我鼠标移到“土豆”,然后移到屏幕外,然后移到“香蕉”, 控制文本 会说“土豆”)。立即窗口显示正确的位置并更新 控制文本 所以它看起来工作正常,但只有在 控制文本 如图所示。

    我调查了其他事件 ListBox 例如 MouseDown MouseUp 但它们只在看起来像是点击的情况下工作。例如 this one 似乎是说,唯一的方法就是点击更新它。

    有强迫的方法吗 控制文本 在显示之前更新,或者,更好的是,显示已更新 控制文本 使用时立即 MouseMove 事件?

    编辑 : 需求说明:用户表单上的空间很稀疏,要显示的文本可以很长(最多60个字)。

    1 回复  |  直到 7 年前
        1
  •  1
  •   JvdV    7 年前

    我怀疑真的有这样的事情 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
    

    结果:

    enter image description here

    如果有人能想出其他解决方案,那将是非常有趣的:)

    祝你好运!