J'ai essayé de trouver une méthode en C# pour mesurer la taille d'une chaîne. Le standard method pour mesurer une chaîne dans Win32 consiste à utiliser GetTextExtent. Le véritable objectif est de trouver la moyenne largeur et la hauteur d'un caractère de police. La méthode standard pour trouver la largeur moyenne d'un caractère commence à obtenir la largeur de tous les caractères alphabétiques et diviser par 52:Graphics.MeasureString renvoie différentes valeurs que Win32 GetTextExtent
size = dc.GetTextExtent(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52);
averageWidth = size/52;
Microsoft a une page qui répertorie les average character widths pour certaines tailles de police à certains paramètres DPI et Je les ai confirmés par mes propres appels à GetTextExtent.
- Tahoma 8pt, 96dpi: 13x6 px
- Tahoma 9pt, 96dpi: 14x7 px
- Segoe 9pt UI, 96dpi: 15x7 px
Maintenant, je veux effectuer les mêmes calculs sous .NET WinForms.
public static SizeF GetAvgCharSizeF(Graphics g, Font font)
{
String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
SizeF textSize = g.MeasureString(s, font);
float baseUnitX = (textSize.Width/s.Length);
float baseUnitY = textSize.Height;
return new SizeF(baseUnitX, baseUnitY);
}
Unfortunatly les valeurs ne correspondent pas aux connues, acceptées, les vraies valeurs::
- Tahoma 8pt, 96dpi: je viens avec code à l'aide Graphics.MeasureString() 14x6 px (14.21x6.09 px)
- Tahoma 9 pt, 96 dpi: 16x7 px (15.98x6.85 px)
- 9pt Segoe UI, 96dpi: 17x7 px (17.46x6.91 px)
Les largeurs de caractères moyenne s'avérer OK, mais les hauteurs de caractères sont trop grandes d'environ 13%. Je suppose que la hauteur supplémentaire est due à une différence dans la classification de la hauteur ayant été modifiée pour inclure ascendants et descendants. Si la chaîne de mesure mesurait trop grand, je l'ai essayé changer de:
String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
à
String s = "acemnorsuvwxyz";
penser que maintenant la chaîne est pas aussi grand, et donc la hauteur mesurée devrait être plus courte. Non, il renvoie le exact mêmes hauteurs que la version de la chaîne qui incluait ascendants et descendants (bien que les largeurs moyennes sont légèrement plus grandes).
Quelle peut être la cause de cela, et peut obtenir la hauteur moyenne des caractères ce qui peut être fait à la hauteur moyenne du texte afin qu'il corresponde aux valeurs acceptées retournées par GetTextExtent?
Remarque: Bien que la méthode standard pour obtenir la hauteur moyenne des caractères consiste à utiliser GetTextMetrics, la hauteur renvoyée par GetTextExtents renvoie la même valeur.
Avez-vous essayé TextRenderer.MeasureText? –