Laden...

Höhe eines mit "DrawText" gezeichneten Textes bestimmen

Erstellt von mundi vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.652 Views
M
mundi Themenstarter:in
6 Beiträge seit 2011
vor 12 Jahren
Höhe eines mit "DrawText" gezeichneten Textes bestimmen

Hallo,
also mein Problem ist folgendes:
Ich gebe einen Text ausgeben, der eine Breite von 460 Pixel haben soll anhand folgenden Befehles:

e.Graphics.DrawString(Body, font, brush, new Rectangle(10, Y + 69, 460, 300));

Allerdings ist der Text variabel (wird aus dem Internet geladen) und ich möchte, dass der nächste Text direkt drunter geschrieben wird.
Die Breite soll also immer 460 Pixel betragen und die Höhe soll so sein, dass der ganze Text hineinpasst. Der nächste Text soll unter direkt drunter ebenfals mit "DrawText" ausgegeben werden.

danke

C
1.214 Beiträge seit 2006
vor 12 Jahren

e.Graphics.MeasureString, das hättest du auch selbst leicht finden können.

M
mundi Themenstarter:in
6 Beiträge seit 2011
vor 12 Jahren

e.Graphics.MeasureString, das hättest du auch selbst leicht finden können.

Ja, hab' ich auch gefunden, das Problem ist, wenn ich den Text mit MeasureString messe, dann zeigt er mir als Breite die Breite des gesamten Textes an und als Höhe die Höhe einer einzelnen Zeilt.
Das der Text mit DrawString allerdings in mehrere Zeilen ausgeteilt wird ist die Höhe natürlich nicht nur eine Zeile...
Gibt es eine möglichkeit MeasureString die gewünschte Breite eines Textes anzugeben?

C
1.214 Beiträge seit 2006
vor 12 Jahren

Ja, du nimmst eine Überladung, wo du einen rechteckigen Bereicht angeben kannst, denselben wie bei DrawText.

M
mundi Themenstarter:in
6 Beiträge seit 2011
vor 12 Jahren

Hmm, ich programmiere (wohl als einer der letzten) noch für Windows Mobile und dort scheint es keine überladene Version von MeasureString zu geben 😦

danke, trotzdem

C
1.214 Beiträge seit 2006
vor 12 Jahren

Sowas musst du natürlich dazu sagen, sonst macht es keinen Sinn. Auf der Mobile Plattform gibt es (laut MSDN, ich selber programmier nichts dafür) TextRenderer.MeasureText

M
mundi Themenstarter:in
6 Beiträge seit 2011
vor 12 Jahren

Ja, 'schuldigung, wusste nicht, dass es dort solche Unterschiede gibt.
Also TextRenderer scheint es nicht zu geben (TextRenderer does not exist in the current context) obwohl es unter "system.windows.forms" existieren solte 😦

C
2.122 Beiträge seit 2010
vor 12 Jahren

Dann hast du vielleicht ein using vergessen? Schreib mal den Namen voll aus obs dann geht (System.Windows.Forms.TextRenderer).

4.955 Beiträge seit 2008
vor 12 Jahren

Laut meinen Recherchen in der MSDN gibt es nur die eine Graphics.MeasureString(Font, String)-Methode für das Compact Framework (und die Klasse TextRenderer überhaupt nicht): Graphics.MeasureString-Methode
Diese Bemerkung ist entscheidend:

Wird von .NET Compact Framework unterstützt.

M
mundi Themenstarter:in
6 Beiträge seit 2011
vor 12 Jahren

Ich habe eine (etwas umständliche) Funktion erstellt, die mir die Höhe des Textes ausgibt, wenn man die Breite mitgibt (optimiersungspotenial ist wohl vorhanden, doch für mich langs im Moment):


        private int GetTextHeight(String text, int width)
        {
            /* Eine "Graphics" Instanz erstellen */
            Bitmap bitmap = new Bitmap(1, 1);
            Graphics graphics = Graphics.FromImage(bitmap);
            Font font = new Font("Tahoma", 9, FontStyle.Regular);

            int i = 0;
            int lastSpace = 0;
            int lines = 0;
            String temp;

            while (i < text.Length)
            {
                do
                {
                    /* Nach nächstem Leerzeichen suchen */
                    i++;
                    lastSpace = i;
                    while ((i < text.Length) && (text[i] != ' '))
                        i++;
                    temp = text.Substring(0, i);
                } while ((i < text.Length) && (graphics.MeasureString(temp, font).Width <= width));

                /* Text beim letzten gefundenen Leerzeichen abschneiden */
                if (i < text.Length)
                    text = text.Substring(lastSpace, text.Length - lastSpace);
                else
                    text = "";
                lastSpace = i = 0;
                lines++;
            }

            /* Rückgabewert berechnen */
            return lines * (int)graphics.MeasureString("0", font).Height;
        }

Danke für die Hilfe

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo mundi,

gib die Ressourcen mit Dispose wieder frei - bzw. noch einfacher: pack sie in eine using-Anweisung.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
mundi Themenstarter:in
6 Beiträge seit 2011
vor 12 Jahren

Wie gesagt hab' ich nur so schnell geschrieben, ich hab' gedacht (ich hab' eben erst mit C# angefangen) dass das der Garbage Collector macht, allerdings scheint man besser zu haben Objekte mit Dispose freizugeben, wie es scheint.

Danke nochmals