VB.NET Listbox Move mit Toolstrip

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    VB.NET Listbox Move mit Toolstrip

    Ein freundliches Hallo und guten Morgen in die Runde,

    ich habe eine Listbox auf der Form, die mit Artikel-Nummern befüllt wird. Wenn ich jetzt mit der Maus über ein Item in der Listbox fahre, soll im Filesystem ein kleines Bildchen passend zur Artikel-Nummer gesucht und im Tooltip angezeigt werden.
    Das klappt soweit auch ganz gut, leider "flackert" das Tooltip, obwohl die Maus nicht bewegt wird. Ich weiß leider nicht, ob und wie man dies abstellen kann, deshalb frage ich hier mal nach.
    Folgenden Code habe ich aktuell im Einsatz:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnLoad(ByVal e As EventArgs)
    2. MyBase.OnLoad(e)
    3. ToolTip1.OwnerDraw = True
    4. End Sub
    5. Private Sub ToolTip1_Popup(ByVal sender As Object, ByVal e As PopupEventArgs) Handles ToolTip1.Popup
    6. e.ToolTipSize = New Size(160, 170)
    7. End Sub
    8. Private Sub ToolTip1_Draw(ByVal sender As Object, ByVal e As DrawToolTipEventArgs) Handles ToolTip1.Draw
    9. If My.Computer.FileSystem.FileExists(hover_image_path & hover_image & ".jpg") Then
    10. hover_bild = System.Drawing.Image.FromFile(hover_image_path & hover_image & ".jpg")
    11. Else
    12. hover_bild = System.Drawing.Image.FromFile(hover_image_path & "no_image.jpg")
    13. End If
    14. e.Graphics.Clear(SystemColors.ControlText)
    15. e.Graphics.DrawImage(hover_bild, New Point(16, 16))
    16. TextRenderer.DrawText(e.Graphics, e.ToolTipText, e.Font, _
    17. New Rectangle(50, 80, e.Bounds.Width - 72, e.Bounds.Height - 16), _
    18. SystemColors.ControlText, Color.White, _
    19. TextFormatFlags.WordBreak Or TextFormatFlags.VerticalCenter)
    20. End Sub
    21. Private Sub ListBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseMove
    22. Dim index As Integer = ListBox1.IndexFromPoint(e.Location)
    23. If index <> -1 AndAlso index < ListBox1.Items.Count Then
    24. If ToolTip1.GetToolTip(ListBox1) <> ListBox1.Items(index).ToString Then
    25. hover_image = ListBox1.Items(index).ToString
    26. hover_image = hover_image.Substring(0, 7)
    27. hover_text = ListBox1.Items(index).ToString
    28. hover_text = hover_text.Substring(0, 2) & "." & hover_text.Substring(2, 3) & "." & hover_text.Substring(5, 2) & "." & hover_text.Substring(7, 2)
    29. ToolTip1.SetToolTip(ListBox1, hover_text)
    30. End If
    31. End If
    32. End Sub

    Vielen Dank für die Hilfe!
    Grüße Markus
    Kann man das Problem durch einen DoubleBuffer ändern?

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Setzt die DoubleBuffered Eigenschaft für das angegebene Steuerelement auf True.
    3. ''' </summary>
    4. Private Sub SetDoubleBuffered(ctrl As Control)
    5. If System.Windows.Forms.SystemInformation.TerminalServerSession Then
    6. Return
    7. End If
    8. Dim propertyInfo As System.Reflection.PropertyInfo = GetType(System.Windows.Forms.Control).GetProperty("DoubleBuffered", _
    9. (System.Reflection.BindingFlags.NonPublic Or _
    10. System.Reflection.BindingFlags.Instance))
    11. propertyInfo.SetValue(ctrl, True, Nothing)
    12. End Sub


    Edit:// @Outsider77
    Allerdings hat das denke ich damit nichts zu tun wenn ich nocheinmal deinen Post genauer lese. Wobei es beim Bildzeichnen, nicht schaden könnte :)
    Ich glaube das Problem ist, dass SetToolTip öfters aufgerufen wird. Speicher den derzeitigen Index in einer externen Variablen ab,
    und stell einmal eine neue Bedingung, sodass die Methode GetToolTip etc. nur aufgerufen wird, wenn der index sich verändert hat.
    Also If LastIndex <> index Then


    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Hallo Gather,
    vielen Dank erstmal für Deine Antwort.
    Ich habe es statt mit dem Index, mal mit dem Item selber getestet. Und es klappt, das flackern ist weg.
    Beim Index dachte ich, dass der Point der Maus sich vll schneller ändert und deshalb das Flackern eher wieder auftritt.
    Deine DoubleBuffered-Sub habe ich trotzdem drin, schadet ja nicht.
    Danke für den Gedanken-Anstoß!
    Gruß
    @Outsider77 Nimm das .HOver-Event, das kommt erst, wenn die Maus etwas stillsteht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!