none
TextRenderer.MeasureText increases the width but should not RRS feed

  • Frage

  • Deutsche Übersetzung im zweiten Beitrag...

    I'm over a C# application that draws boxes and texts. The size of the box rectangle is calculated from layout decisions and fixed. The text is painted into the rectangle and should be wrapped as good as possible under those circumstances. Now, under the text, another string should be painted, with a different font. I have to call TextRenderer.DrawText twice, once for each string with its respective font parameter. To determine the location to draw the second string at, I call TextRenderer.MeasureText to get the height of the first one.

    But that doesn't quite work. Assuming I have a rather narrow rectangle and the following string: "a b c d e f g h i j averylongword". When painting the text with TextRenderer.DrawText, passing it a Rectangle rect, the last word won't fit in the width of the rectangle. All of the letters at the beginning are drawn to the end of the line, then wrapping over to a new line. But MeasureText, passing it proposedSize = new Size(rect.Width, 0), will find that the long word doesn't fit in proposedSize.Width and thus increases the layout size. This will then have the effect that all the letters (or smaller words) fit into less lines than with the original proposed size. The result is that the returned size has a much smaller height than DrawText would really use to draw the text.

    I hope I could explain the situation well enough.

    I need a way to determine the real height of the text displayed on the screen using TextRenderer.DrawText so that I can follow up the second text at the right location. This doesn't work reliably right now.

    Edit: Ups, was ist hier passiert, plötzlich nur noch deutschsprachige Beiträge... ist das neu? Bin ich hier falsch?
    • Bearbeitet LonelyPixel Freitag, 22. Januar 2010 15:43
    Freitag, 22. Januar 2010 12:01

Antworten

  • Im englischen Forum wurde eine Antwort gefunden: Wenn man TextFormatFlags.WordEllipsis statt EndEllipsis verwendet, werden auch lange Wörter in der Mitte des Strings gekürzt und MeasureText vergrößert das Rechteck nicht, folglich kommt die richtige Größe raus.

    Hier geht's zum ganzen Thread.
    • Als Antwort markiert LonelyPixel Mittwoch, 27. Januar 2010 08:27
    Mittwoch, 27. Januar 2010 08:27

Alle Antworten

  • Hallo LonelyPixel,

    Du bist nicht falsch wenn es um .NET Framework Programmierung geht, nur die Sprache sollte Deutsch sein weil wir in dem Deutschen MSDN Forum sind.

    Kannst Du bitte Dein Problem nochmals in Deutsch beschreiben?

    Danke und Grüße,

    Robert

    Freitag, 22. Januar 2010 14:08
    Moderator
  • Wo finde ich denn das englischsprachige Forum, das war doch sonst immer hier?

    Erstmal das ganze auf deutsch:

    Ich bin also grade an einer C#-Anwendung, die Boxen und Text zeichnet. Die Größe der Box-Rechtecke wird nach Layoutentscheidungen bestimmt und ist festgelegt. Der Text wird in das Rechteck gezeichnet und sollte so gut es unter diesen Umständen eben geht umgebrochen werden. Unter dem Text soll noch ein anderer String mit einer anderen Schriftart gezeichnet werden. Dafür muss ich TextRenderer.DrawText zweimal aufrufen, einmal für jeden String mit der entsprechenden Schriftart. Um die Position des zweiten Strings herauszufinden, rufe ich TextRenderer.MeasureText auf.

    Das funktioniert aber nicht richtig. Angenommen ich habe ein recht schmales Rechteck und folgenden String: "a b c d e f g h i j einsehrlangeswort". Wenn ich den Text mit TextRenderer.DrawText zeichne und dabei ein Rectangle rect übergebe, passt das letzte Wort nicht ins Rechteck. Die Buchstaben zu Beginn werden bis zum Zeilenende angezeigt, dann geht es in der nächsten Zeile weiter. Wenn ich aber MeasureText aufrufe und dabei proposedSize = new Size(rect.Width, 0) übergebe, erkennt die Funktion, dass das lange Wort nicht in proposedSize.Width hineinpasst und erhöht deshalb die Layoutgröße. Das hat zur Folge, dass die anderen einzelnen Buchstaben (oder kurze Wörter) jetzt in weniger Zeilen passen als es bei der ursprünglichen proposedSize der Fall gewesen wäre. Im Endeffekt hat die zurückgegebene Größe eine viel geringere Höhe als DrawText wirklich zum Zeichnen des Texts verwendet.

    Hoffentlich konnte ich die Situation anschaulich genug erklären.

    Ich brauche eine Möglichkeit, die tatsächliche Höhe des mit TextRenderer.DrawText gezeichneten Texts zu ermitteln, damit ich den zweiten Text an der richtigen Stelle anzeigen kann. Das funktioniert derzeit nicht zuverlässig.
    Freitag, 22. Januar 2010 15:43
  • Hallo,

    ein Codeschnippsel wäre hier anstatt vieler Worte hilfreicher.
    (deutsch oder englisch ist mir wie die Programmier-Sprache egal)


    Der TextRenderer ist nur eine kleine Verpackung um DrawTextEx ,
    das im Falle von MeasureText zusätzlich mit DT_CALCRECT aufgerufen wird.
    Angaben von TextFormatFlags .ExternalLeading mögen in Deinem Falle
    das Ergebnis verbessern.

    Ein passendes englischsprachiges Forum findest Du unter:
    http://social.msdn.microsoft.com/Forums/en-US/category/windowsforms

    Generell: Ersetze in der URL "de-DE durch "en-US", wenn der Browser, was anderes vorschlägt,
    was er anhand der Spracheinstellungen gerne mal ungefragt tut.

    Gruß Elmar
    Freitag, 22. Januar 2010 19:29
    Beantworter
  • Im englischen Forum wurde eine Antwort gefunden: Wenn man TextFormatFlags.WordEllipsis statt EndEllipsis verwendet, werden auch lange Wörter in der Mitte des Strings gekürzt und MeasureText vergrößert das Rechteck nicht, folglich kommt die richtige Größe raus.

    Hier geht's zum ganzen Thread.
    • Als Antwort markiert LonelyPixel Mittwoch, 27. Januar 2010 08:27
    Mittwoch, 27. Januar 2010 08:27