2012-11-18 12 views
8

Ho un controllo utente WinForms e sto cercando di ottenere l'esatta spaziatura orizzontale dei caratteri per il carattere corrente, che dovrebbe essere mono-spaziato.Ottiene le metriche di un font in pixel

Sembra che la proprietà Size del font fornisca questa informazione, ma apparentemente è a punti e sto lavorando in pixel.

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

Se creo il carattere da solo, posso specificare che utilizza le unità Pixel. Ma nel mio caso il carattere è impostato tramite una proprietà del mio controllo utente e non riesco a determinare come viene creato il carattere. Sfortunatamente, la proprietà Unit del font è di sola lettura.

Come è possibile rendere una metrica di ritorno dei caratteri esistente in pixel?

+0

Font.Size restituisce l'altezza * * del carattere, non la larghezza. Avrai bisogno di misurare con, ad esempio, TextRenderer.MeasureText(); Doloroso a causa del padding. Misura, diciamo, nuova stringa ('m', 100) e dividi per 100. –

+0

Grazie, ero abituato a sentire em nel contesto della larghezza. Ho visto 'Graphics.MeasureString' ma sembra che' MeasureText' sia in pixel. Lo verificherò, anche se sto iniziando a pensare che il mio approccio migliore sia quello di aggiungere dichiarazioni per chiamare la funzione 'GetTextMetrics' di Windows. –

+0

@JonathanWood: MeasureText o MeasureString non forniscono la spaziatura dei caratteri, vero? – Neolisk

risposta

4

consulta questo articolo su MSDN:

How to: Obtain Font Metrics

Per ottenere pixel, si utilizza la formula di conversione.

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

Vedere anche Get single glyph metrics (.net).

+0

Grazie, ma sto avendo problemi a dare un senso a questo. Innanzitutto, che cos'è la "discesa"? E in secondo luogo, se sto cercando di ottenere la spaziatura orizzontale, perché dovremmo usare 'GetEmHeight()', che sta restituendo qualcosa sull'altezza del carattere? (Nota: ho aggiornato la mia domanda perché forse non ero del tutto chiaro che avevo bisogno della spaziatura orizzontale.) –

+0

@JonathanWood: Ancora non del tutto chiaro sul tuo intento. 'Font.Size' è una dimensione verticale del carattere, non spaziatrice, e sicuramente non ha nulla a che fare con la spaziatura orizzontale del carattere, che è specifica per il font che hai scelto. Hai provato [questo] (http://stackoverflow.com/a/485061/897326) per convertire i punti em in pixel? – Neolisk

+0

Sì, come ho sottolineato in risposta ad altri commenti, sembra che fossi confuso su cosa sia 'Size'. Quindi sembra che ora non abbia nemmeno un valore da convertire. Guardando l'API di Windows 'GetTextMetrics' o forse un altro approccio. –

3

Se si utilizza un oggetto System.Windows.Forms.Control, è possibile utilizzare il seguente codice:

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