2010-11-18 16 views
11

Powiedzmy, że renderuję znak "A" na ekranie z czcionką rozmiaru 14 w Arial Regular. Czy istnieje sposób w języku C#, aby obliczyć, ile pikseli jest szeroka?Określanie szerokości renderowanego znaku w .NET


Dzięki za wszystkie dotychczasowe odpowiedzi. Sposób renderowania tekstu odbywa się za pomocą ArcEngine firmy ESRI, która wykonuje wywołania do GDI lub GDI + (nie wiem które) w sposób okrągły o modzie za pośrednictwem silnika DynamicDisplay.

Odpowiedz

10

To zależy od używanego aparatu renderującego. .NET może używać GDI lub GDI +. Przełączanie można wykonać, odpowiednio ustawiając właściwość UseCompatibleTextRendering lub wywołując metodę Application.SetCompatibleTextRenderingDefault.

Przy użyciu GDI + należy użyć MeasureString:

string s = "A sample string"; 

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

Przy użyciu GDI (czyli natywny renderowania Win32) należy użyć klasy TextRenderer:

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

Więcej szczegółów są opisane w tym artykule :

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

Należy zauważyć, że powyższe dotyczy Windows Forms. W WPF można byłoby przy użyciu FormattedText

+0

O, interesująca rzecz z metodą "UseCompatibleTextRendering". Jednak wydaje się, że dotyczy to aplikacji zakodowanych tylko w VB, czyż nie? – Lucero

+0

@ Lucero: Nie, dotyczy ogólnie środowiska .NET. –

4

Nie mówisz, jak to "renderujesz", ale jeśli masz ciąg, możesz użyć również MeasureString.

3

Niezupełnie, można tylko oszacować. Podpowiedź TrueType, kerning i zwis glifu sprawia, że ​​mierzenie poszczególnych postaci jest niemożliwe. Niektóre kod:

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

To zwraca 13.1 na moim komputerze. Unikaj tego.

2

Właściwość MeasureString wskazuje, jak szerokie pole należy użyć, aby wyświetlić ciąg znaków, umożliwiając pewne "zamoczenie" nawisów. W szczególności, zgłoszona szerokość "a" plus raportowana szerokość "b" może być znacznie większa niż podana szerokość "ab". W przybliżeniu sugerowałbym, że jeśli chcesz szerokość "a", odejmij szerokość "||" od szerokości "| a |". Zauważ, że będzie to tylko przybliżenie, zarówno ze względu na problemy z zaokrąglaniem, jak i dlatego, że szerokość znaków zależy od kontekstu. Na przykład w wielu czcionkach napis "TATATATAT" może wydawać się węższy niż "AAAATTTTT", ponieważ litery A mogą się zagnieżdżać pod literami T.

Powiązane problemy