Frage

Ich bin mit Pixel als Maßeinheit für meine schriftart.In einem Ort, trete ich einen Treffer-test, um zu überprüfen, ob der Benutzer geklickt hat, innerhalb des Begrenzungsrechtecks der text auf dem Bildschirm.Ich brauche etwas wie MeasureString für diese.Leider ist der code tut der hit-test ist tief in eine Bibliothek, die nicht haben Zugang zu Graphics Objekt oder sogar ein Control.

Wie bekomme ich die bounding box einer Zeichenfolge gegeben, die Schrift ohne die Graphics Klasse?Warum muss ich auch brauchen Graphics Objekt als meine schriftart in Pixel?

War es hilfreich?

Lösung

Wenn Sie einen Verweis auf System.Windows.Formen verwenden, versuchen Sie die TextRenderer-Klasse.Es ist eine statische Methode (MeasureText), die den string und die schriftart und gibt die Größe. MSDN Link

Andere Tipps

Sie nicht brauchen, um verwenden Sie das graphics-Objekt, das Sie verwenden, um das Rendern zu tun die Messung.Sie können eine statische utility-Klasse:

public static class GraphicsHelper
{
    public static SizeF MeasureString(string s, Font font)
    {
        SizeF result;
        using (var image = new Bitmap(1, 1))
        {
            using (var g = Graphics.FromImage(image))
            {
                result = g.MeasureString(s, font);
            }
        }

        return result;
    }
}

Es könnte interessant sein, abhängig von Ihrer situation, um den dpi-Wert der bitmap als gut.

MeasureString Methode in @NerdFury Antwort geben einer höheren saite Breite als erwartet.Weitere Infos finden Sie hier.Wenn Sie möchten, Messen Sie nur die physische Länge bitte fügen Sie diese beiden Zeilen :

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
result = 
  g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic);

In diesem Beispiel wird die große Aufgabe, welche die Verwendung der FormattedText.FormattedText bietet low-level-Steuerung für das zeichnen von text in Windows Presentation Foundation (WPF) - Anwendungen.Sie können es verwenden, um Messen die Breite eines Strings mit einer bestimmten Schriftart, ohne mit einem Graphics-Objekt.

public static float Measure(string text, string fontFamily, float emSize)
{
    FormattedText formatted = new FormattedText(
        item, 
        CultureInfo.CurrentCulture, 
        System.Windows.FlowDirection.LeftToRight, 
        new Typeface(fontFamily), 
        emSize, 
        Brushes.Black);

    return formatted.Width;
}

Gehören WindowsBase und PresentationCore Bibliotheken.

Das darf nicht sein, aber eine Wiederholung der anderen, aber mein problem war das unerwünschte Graphics-Objekt als gut.Nach dem hören der oben Frust habe ich dann einfach versucht:

Size proposedSize = new Size(int.MaxValue, int.MaxValue);
TextFormatFlags flags = TextFormatFlags.NoPadding;
Size ressize = TextRenderer.MeasureText(content, cardfont, proposedSize, flags);

(wo "Inhalt" die Zeichenfolge zu Messen und cardfont die schriftart in)

...und war im Glück.Konnte ich das Ergebnis verwenden, um die Breite meiner Spalte in VSTO.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top