2010-11-18 8 views
11

Lassen Sie mich sagen, dass ich das Zeichen "A" auf dem Bildschirm mit einer Schriftgröße 14 in Arial Regular rendern. Gibt es eine Möglichkeit in C# zu berechnen, wie viele Pixel breit es ist?Ermitteln, wie breit ein gerendertes Zeichen in .NET ist.


Danke für alle bisherigen Antworten. Die Art und Weise, wie ich Text rende, geschieht über ESRIs ArcEngine, die in einer Runde über Mode über die DynamicDisplay-Engine Aufrufe an GDI oder GDI + macht (ich weiß nicht welche).

Antwort

10

Dies hängt von der verwendeten Rendering-Engine ab. .NET kann GDI oder GDI + verwenden. Die Umschaltung kann erfolgen, indem die Eigenschaft UseCompatibleTextRendering entsprechend eingestellt oder die Methode Application.SetCompatibleTextRenderingDefault aufgerufen wird.

Bei der Verwendung von GDI + Sie sollten MeasureString verwenden:

SizeF size = TextRenderer.MeasureText(s, new Font("Arial", 24)); 

Weitere Details werden in diesem Artikel beschrieben:

string s = "A sample string"; 

SizeF size = e.Graphics.MeasureString(s, new Font("Arial", 24)); 

Wenn GDI (dh das native Win32-Rendering) Sie TextRenderer Klasse verwenden sollten :

Text Rendering: Build World-Ready Apps Using Complex Scripts In Windows Forms Controls

Beachten Sie, dass das obige über Windows Forms spricht. In WPF würden Sie FormattedText

+0

Oh, interessante Sache mit der 'UseCompatibleTextRendering' Methode. Dies scheint jedoch nur für Anwendungen zu gelten, die in VB codiert sind, oder? – Lucero

+0

@Lucero: Nein, es gilt für .NET im Allgemeinen. –

4

Sie sagen nicht, wie Sie es "rendern", aber wenn Sie eine Zeichenfolge haben, können Sie auch MeasureString verwenden.

3

Nicht wirklich, Sie können nur einen Kostenvoranschlag machen. TrueType-Hinting, Kerning und Glyph-Überhang machen das Messen einzelner Zeichen nahezu unmöglich. Irgendein Code:

public float GetAWidth() { 
     using (var font = new Font("Arial", 14)) { 
      SizeF size = TextRenderer.MeasureText(new string('A', 100), font); 
      return size.Width/100; 
     } 
    } 

Das gibt 13.1 auf meiner Maschine zurück. Vermeiden Sie dies.

2

Die MeasureString-Eigenschaft gibt an, wie breit ein Feld zum Anzeigen einer Zeichenfolge verwendet werden soll, um Überhänge zu vermeiden. Insbesondere ist die gemeldete Breite von "a" plus die gemeldete Breite von "b" wahrscheinlich viel größer als die berichtete Breite von "ab". Als grobe Näherung würde ich vorschlagen, dass Sie die Breite von "||" subtrahieren, wenn Sie die Breite von "a" möchten. aus der Breite von "| a |". Beachten Sie, dass dies immer nur ungefähr ist, sowohl aufgrund von Rundungsproblemen als auch weil die Zeichenbreiten mit dem Kontext variieren. Zum Beispiel kann in vielen Fonts die Zeichenkette "TATATATAT" schmaler als "AAAATTTTT" erscheinen, weil sich die A unter die Ts schmiegen können.

Verwandte Themen