2012-11-18 11 views
8

Mam kontrolkę użytkownika WinForms i próbuję uzyskać dokładny poziomy odstęp między znakami dla bieżącej czcionki, która ma być monoprzestrzenna.Pobierz metrykę czcionki w pikselach

Wygląda jak właściwość czcionki Size zapewnia tę informację, ale najwyraźniej jest w punktach i pracuję w pikselach.

var fontWidth = this.Font.Size; // Returns em-size in points--not pixels 

Jeśli samodzielnie utworzę czcionkę, mogę określić, że używa ona jednostek pikseli. Ale w moim przypadku czcionka jest ustawiona przez właściwość mojej kontroli użytkownika i nie mogę określić, w jaki sposób czcionka jest tworzona. Niestety, właściwość czcionki Unit jest tylko do odczytu.

Jak utworzyć istniejące dane o zwracanej czcionce w pikselach?

+0

Font.Size zwraca * wysokość * czcionki, a nie szerokości. Będziesz musiał zmierzyć za pomocą, powiedzmy, TextRenderer.MeasureText(); Bolesne z powodu wyściółki. Zmierz, powiedzmy, nowy ciąg ("m", 100) i podziel przez 100. –

+0

Dzięki, byłem przyzwyczajony do słuchania o em w kontekście szerokości. Spojrzałem na 'Graphics.MeasureString', ale wygląda na to, że' MeasureText' jest w pikselach. Sprawdzę to, chociaż zaczynam myśleć, że moim najlepszym sposobem jest dodanie deklaracji, aby wywołać funkcję Windows 'GetTextMetrics'. –

+0

@JonathanWood: MeasureText lub MeasureString nie dawałyby ci odstępów między znakami, prawda? – Neolisk

Odpowiedz

4

Proszę zobaczyć ten artykuł w witrynie MSDN:

How to: Obtain Font Metrics

Aby uzyskać pikseli, należy użyć wzoru konwersji.

descentPixel = font.Size * descent/fontFamily.GetEmHeight(FontStyle.Regular); 

Zobacz także Get single glyph metrics (.net).

+0

Dzięki, ale mam problem z tym. Po pierwsze, czym jest "zejście"? Po drugie, jeśli próbuję uzyskać poziomy odstęp, dlaczego użyjemy 'GetEmHeight()', która zwraca coś na temat wysokości czcionki? (Uwaga: Aktualizuję moje pytanie, ponieważ być może nie do końca jestem przekonany, że potrzebuję poziomych odstępów.) –

+0

@ JonathanWood: Wciąż nie całkiem jasne, co zamierzacie. "Font.Size" jest pionowym rozmiarem postaci, a nie spacją i zdecydowanie nie ma nic wspólnego z poziomym odstępem między znakami czcionki, który jest charakterystyczny dla wybranej czcionki. Czy próbowałeś [to] (http://stackoverflow.com/a/485061/897326), aby przekonwertować punkty em na piksele? – Neolisk

+0

Tak, jak wskazałem w odpowiedzi na inne komentarze, wydaje się, że byłem zdezorientowany tym, co robi "Rozmiar". Wygląda więc na to, że nie mam obecnie żadnej wartości do przekonwertowania. Patrząc na API Windows 'GetTextMetrics' lub być może inne podejście. –

3

przypadku korzystania z obiektu System.Windows.Forms.Control, można użyć następującego kodu:

using (Graphics g = this.CreateGraphics()) 
{ 
    var points = myFont.SizeInPoints; 
    var pixels = points * g.DpiX/72; 
    MessageBox.Show("myFont size in pixels: " + pixels); 
} 
Powiązane problemy