Wie Messen Sie die Breite in pixel für eine Ziffer in einer bestimmten schriftart / - Größe (C#)
Ich versuche zu berechnen, die pixel-Breite von Excel-Spalten, wie beschrieben in dieser Beitrag, mit der offiziellen Formel von der OpenXML-Spezifikation. Um jedoch die Anwendung dieser Formel, die ich brauche, um zu wissen, die Maximalen Wert für die Breite der Normalen schriftart, die die pixel-Breite des breitesten numerischen Zeichen. Der OpenXML-Spezifikation gibt dieses Beispiel als Verdeutlichung:
Mit der schriftart Calibri als ein Beispiel, den maximalen Wert für die Breite der 11 Punkt-Schrift
Größe ist 7 Pixel (96 dpi).
Ich habe überprüft, dass diese korrekt sind, indem Sie visuell untersuchen Calibri 11 Punkt Stelle, und es ist in der Tat 7 Pixel breit. So, ich bin versucht, erstellen Sie eine Methode, die zurückkehren wird der maximale Ziffernbreite, die für jede schriftart /- Größe.
Folge ich den Empfehlungen in diese Frage, aber es hat nicht die Ergebnisse, die ich erwarte.
Hier mein test code:
var font = new Font("Calibri", 11.0f, FontStyle.Regular);
for (var i = 0; i < 10; i++)
{
Debug.WriteLine(TextRenderer.MeasureText(i.ToString(), font));
}
Diese Berichte, dass alle Ziffern haben eine Breite von 15.
Irgendwelche Vorschläge, bitte?
Dank,
Tim
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie mich zunächst sagen, dass der code, den ich bin, zu zeigen, sieht aus wie eine schreckliche hack, und ich bin nicht präsentiert es als eine Lösung. Lieber, ich hoffe, es verrät ein wenig mehr über das Verhalten von MeasureText können dazu führen, dass Sie Ihre endgültige Lösung.
Machte ich eine leichte änderung an Ihrem code. Ich bin der Messung der Länge von zwei Unterstrich-Zeichen. Klicken Sie dann im Rumpf der for-Schleife bin ich mess das gewünschte Zeichen mit Unterstrichen auf jeder Seite, und subtrahieren Sie die Länge der beiden Unterstrich-Zeichen allein. Für das Testszenario, ich bin immer ein Ergebnis von 7. Der Hauptzweck dieser war es, festzustellen, ob MeasureText Buchhaltung für Polsterung auf einer Zeichen-für-Zeichen-basis oder Leerstellen am Anfang/Ende des Strings. Es scheint, dass es letzteres. Vielleicht dies, kombiniert mit einigen der anderen input, den Sie erhalten haben, führen Sie zu einer eleganteren Lösung.
TextRenderer ist nicht immer genau die Weise, die Sie erwarten würden:
Aus der MSDN: http://msdn.microsoft.com/en-us/library/8wafk2kt.aspx
Haben Sie eine
Graphics
Objekt oder einem Steuerelement-Objekt? Wenn Sie diese erhalten Sie genaue restults die Art und Weise, die Sie erwarten würden.Werfen Sie einen Blick auf http://msdn.microsoft.com/en-us/library/6xe5hazb(VS.80).aspx
MeasureText fügt Polsterung, die Menge ist ziemlich unberechenbar, obwohl es sich grob skaliert Linear mit der Schriftgröße. Der trick ist, zu subtrahieren zwei Messungen, um loszuwerden, die Polsterung. Dieser generierte code sehr gerne zahlen:
Ausgabe:
Bekommt Sie die 7 Pixel, die Sie suchen. Beachten Sie, dass Sie haben, um Platz für TrueType-hinting, kann es passen Sie die Form der Ziffer, so dass die wichtigsten Stämme fallen auf pixel-Grenzen. Fügen Sie mindestens ein pixel.
Text Messen breiten kann ein nighmare.. ich weiß nicht, warum Sie es so verwirrend..
Hier ist der Genaueste Weg, Ive bekam zu Messen, die Länge des Textes :
Ich bin mir nicht 100% sicher, dass es das ist, was Sie genau brauchen.
Aber möchten Sie vielleicht einen Blick auf diese Microsoft Seite: