So messen Sie die Pixelbreite einer Ziffer in einer bestimmten Schriftart / Größe (C #)

8

Ich versuche, die Pixelbreite von Excel-Spalten zu berechnen, wie in dieser Beitrag , mit der offiziellen Formel aus der OpenXML-Spezifikation. Um diese Formel anzuwenden, muss ich jedoch die Maximale Ziffernbreite der Normalen Schriftart kennen, die die Pixelbreite der breitesten numerischen Ziffer ist. Die OpenXML-Spezifikation gibt dieses Beispiel zur Verdeutlichung:

Verwenden Sie die Calibri-Schriftart als Beispiel, die maximale Ziffernbreite von 11 Punkt Schriftart Die Größe beträgt 7 Pixel (bei 96 dpi).

Ich habe überprüft, ob dies korrekt ist, indem ich eine Calibri 11-Punkt-Ziffer visuell untersuche und sie tatsächlich 7 Pixel breit ist. Also, ich versuche, eine Methode zu erstellen, die die maximale Ziffernbreite für jede Schriftart / Größe zurückgibt.

Ich habe die Empfehlungen in diese Frage , aber es bringt nicht die Ergebnisse, die ich erwarte.

Hier ist mein Testcode:

%Vor%

Dies meldet, dass alle Ziffern eine Breite von 15 haben.

Irgendwelche Vorschläge bitte?

Danke, Tim

    
Tim Coulter 02.12.2009, 13:59
quelle

5 Antworten

5

Zuerst möchte ich sagen, dass der Code, den ich vorstelle, aussieht wie ein schrecklicher Hack und ich stelle ihn nicht als Lösung vor. Ich hoffe vielmehr, dass es etwas mehr über das Verhalten von MeasureText verrät, das Sie zu Ihrer endgültigen Lösung führen könnte.

Ich habe Ihren Code geringfügig geändert. Ich vermesse die Länge von zwei Unterstrichen. Im Körper der for-Schleife messe ich dann das gewünschte Zeichen mit Unterstrichen auf beiden Seiten und subtrahiere die Länge der beiden Unterstriche allein. Für das Testszenario erhalte ich ein Ergebnis von 7. Der Hauptzweck war, zu bestimmen, ob MeasureText das Auffüllen Zeichen für Zeichen oder das Auffüllen am Anfang / Ende des Strings berücksichtigt. Es scheint, dass es Letzteres ist. Vielleicht führt dies zusammen mit einigen anderen Eingaben, die Sie erhalten haben, zu einer eleganteren Lösung.

%Vor%     
lJohnson 02.12.2009, 16:26
quelle
5

TextRenderer ist nicht immer genau so, wie Sie es erwarten würden:

Von MSDN: Ссылка

  

Zum Beispiel besteht das Standardverhalten des TextRenderer darin, dem umrahmenden Rechteck des gezeichneten Textes eine Füllung hinzuzufügen, um überhängende Glyphen unterzubringen

Haben Sie ein Graphics -Objekt oder ein Control-Objekt? Wenn Sie diese verwenden, können Sie genaue Ergebnisse erhalten, wie Sie es erwarten würden.

Sehen Sie sich Ссылка

an     
Bob 02.12.2009 14:11
quelle
4

MeasureText fügt Padding hinzu, der Betrag ist ziemlich unvorhersehbar, obwohl er grob linear mit der Schriftgröße skaliert. Der Trick besteht darin, zwei Messungen zu subtrahieren, um das Padding loszuwerden. Dieser Code erzeugte sehr glückliche Zahlen:

%Vor%

Ausgabe:

%Vor%

Damit erhalten Sie die 7 Pixel, nach denen Sie suchen. Achten Sie darauf, dass Sie TrueType-Hinting berücksichtigen müssen. Sie können die Form der Ziffer so anpassen, dass ihre Hauptstämme auf Pixelgrenzen fallen. Fügen Sie mindestens ein Pixel hinzu.

    
Hans Passant 02.12.2009 18:14
quelle
3

Das Messen von Textbreiten kann ein nightmare sein. Ich weiß nicht, warum sie es so verwirrend gemacht haben.

Hier ist der genaueste Weg, wie ich die Länge des Textes messen kann:

%Vor%     
Mongus Pong 02.12.2009 14:17
quelle
1

Ich bin nicht 100% sicher, dass es genau das ist, was Sie brauchen.

Aber vielleicht möchten Sie sich diese Microsoft-Seite ansehen:

BlueTrin 02.12.2009 14:07
quelle

Tags und Links