41 votes

Mesurer une chaîne sans utiliser d'objet graphique?

Je suis à l'aide de pixels que celui de l'unité de ma police. Dans un endroit, je suis d'effectuer un coup d'essai pour vérifier si l'utilisateur a cliqué dans le rectangle de délimitation de texte sur l'écran. J'ai besoin d'utiliser quelque chose comme MeasureString pour cette. Malheureusement, le code en faisant le test de collision est profonde à l'intérieur d'une bibliothèque qui n'ont pas accès à un Graphics objet ou même un Control.

Comment puis-je obtenir la boîte englobante d'une chaîne de caractères donnée à la police sans l'aide de l' Graphics classe? Pourquoi ai-je besoin d'un Graphics de l'objet lors de ma police est en pixels?

47voto

Jarrod Points 664

Si vous avez une référence à System.Windows.Forms, essayez d'utiliser la classe TextRenderer. Il existe une méthode statique (MeasureText) qui prend la chaîne et la police et renvoie la taille. Lien MSDN

23voto

NerdFury Points 9935

Vous n'avez pas besoin d'utiliser l'objet graphique que vous utilisez pour effectuer le rendu pour effectuer la mesure. Vous pouvez créer une classe d'utilitaire statique:

 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;
    }
}
 

Cela peut valoir la peine, en fonction de votre situation, de définir également le dpi de l'image bitmap.

11voto

Anton Putov Points 319

La méthode MeasureString dans la réponse @NerdFury donnera une largeur de chaîne supérieure à celle attendue.Vous pouvez trouver ici des informations supplémentaires. Si vous voulez mesurer uniquement la longueur physique, veuillez ajouter ces deux lignes:

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

1voto

Jacob Raines Points 71

Cet exemple illustre parfaitement l'utilisation de FormattedText. FormattedText fournit un contrôle de bas niveau pour le dessin de texte dans les applications Windows Presentation Foundation (WPF). Vous pouvez l'utiliser pour mesurer la largeur d'une chaîne avec une police particulière sans utiliser d'objet Graphics.

 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;
}
 

Inclure les bibliothèques WindowsBase et PresentationCore.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X