Wie lang ist ein Text in Pixeln

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Wie lang ist ein Text in Pixeln

    Hallo,
    ich baue gerade ein kleines Spiel, und bin gerade am Chat-erstellen. Das klappt auch alles wunderbar, allerdings habe ich folgendes Problem:



    Wie ihr seht, ist jede Zeile 21 Zeichen lang, allerdings sind nicht alle Buchstaben gleich lang und so siehts ein bisschen komisch aus. Aber ich kann ja nicht riskieren, dass der Text aus dem Fenster rausgeht... Wie kann ich herausfinden, wie lang der Text in Pixeln ist? Ich benutzte GDI.
    Mfg
    Vincent

    Könnte mir vielleicht jemand ein bisschen helfen? So sah mein Code aus:

    VB.NET-Quellcode

    1. If ChatShow = True Then
    2. Try
    3. Dim txt As String = ""
    4. For i As Integer = tcp.Chat.Count - 6 To tcp.Chat.Count - 1 Step 1
    5. If i < 0 OrElse tcp.Chat.Count <= 0 Then
    6. Continue For
    7. End If
    8. Dim nachricht As String = ""
    9. If tcp.Chat(i).Message.Length > 25 Then
    10. Dim rest As String = tcp.Chat(i).Absender & ": " & tcp.Chat(i).Message
    11. Do Until rest.Length < 25
    12. nachricht &= rest.Substring(0, 25) & Environment.NewLine
    13. rest = rest.Remove(0, 25)
    14. Loop
    15. Else
    16. nachricht = tcp.Chat(i).Absender & ": " & tcp.Chat(i).Message
    17. End If
    18. txt &= nachricht & Environment.NewLine
    19. Next
    20. g.DrawString(txt, New Font("Segoe UI", 8, FontStyle.Bold), Brushes.White, New Point(Me.Width - 300, 10))
    21. Catch ex As Exception
    22. MessageBox.Show(ex.ToString)
    23. End Try
    24. End If


    tcp.Chat ist eine List Of msg
    msg ist eine Klasse mit den Variablen Message und Absender. Das ganze findet im Paint Event statt.

    So sieht mein umgeschriebener Code aus:

    VB.NET-Quellcode

    1. Dim ChatFont As New Font("Segoe UI", 8, FontStyle.Bold)
    2. If ChatShow = True Then
    3. Try
    4. Dim txt As String = ""
    5. For i As Integer = tcp.Chat.Count - 6 To tcp.Chat.Count - 1 Step 1
    6. If i < 0 OrElse tcp.Chat.Count <= 0 Then
    7. Continue For
    8. End If
    9. Dim nachricht As String = ""
    10. Dim nachrichtLength As SizeF = e.Graphics.MeasureString(nachricht, ChatFont)
    11. If nachrichtLength.Width > 50 Then
    12. Dim rest As String = tcp.Chat(i).Absender & ": " & tcp.Chat(i).Message
    13. Dim restLenght As SizeF = e.Graphics.MeasureString(rest, ChatFont)
    14. Do Until restLenght.Width < 50
    15. nachricht &= rest.Substring(0, 25) & Environment.NewLine 'hier bin ich
    16. rest = rest.Remove(0, 25)
    17. Loop
    18. Else
    19. nachricht = tcp.Chat(i).Absender & ": " & tcp.Chat(i).Message
    20. End If
    21. txt &= nachricht & Environment.NewLine
    22. Next
    23. g.DrawString(txt, ChatFont, Brushes.White, New Point(Me.Width - 300, 10))
    24. Catch ex As Exception
    25. MessageBox.Show(ex.ToString)
    26. End Try
    27. End If


    Aber wie kann ich jetzt herausfinden, bis wohin die Breite 50 geht? (Bis zu welchem Buchstaben)
    Oder ist der Code völlig daneben und es geht anders viel einfacher?
    Die Try-Catch ist dafür, wenn beim ersten Mal ausführen vom Paint Event der Fehler kommen soll.
    Mfg
    Vincent

    Wenn es dir nur darum geht den Text nur eine Bestimmte Größe annehmen zu lassen brauchst du MeasureString gar nicht zu verwenden. Da reicht dir die Überladung von DrawString, bei der du ein Rechteck als Begrenzung angeben kannst, über das dann nicht hinaus gezeichnet wird.
    Ohne das zu kennen nehme ich einfach mal an, dass diese Überladung den Text zieht?
    Falls ja, dann sähe das vermutlich noch bescheuerter aus. Prüfe einfach die Länge, und falls die
    Max-Länge überschritten wird setzt du statt dem letzten " " nen Environment.NewLine.

    Fertig is :D
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Achso, okay :)
    Dann ist das ja im Prinzip nur die automatisierte Methode
    meiner "Idee" ^^

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Och man, da hatte ich mir so viel Mühe gegeben, und dann ist das so einfach...

    VB.NET-Quellcode

    1. g.DrawString(txt, ChatFont, Brushes.White, New Rectangle(New Point(Me.Width - 300, 10), New Size(290, 600)))


    Naja, wieder was gelernt, danke euch beiden :)
    Mfg
    Vincent

    Hi
    aufpassen: Form.Bounds gibt nicht die Abmessungen vom Clientbereich an, wenn du das verwendet hast! Dazu verwendet man ClientSize bzw. ClientRectangle. Besser ist aber eh, wenn du es in eine Renderer-Klasse oder dergleichen auslagerst und immer IRenderables zeichnest. Das könnte z.B. so aussehen:

    VB.NET-Quellcode

    1. Public Interface IRenderable
    2. Sub(ByVal surface As Graphics, ByVal clipBounds As Rectangle)
    3. End Interface

    Der Chat könnte dann ein erweitertes IRenderable mit Eingabe sein.

    Gruß
    ~blaze~