System.Windows.Forms.TextRenderer.DrawText
metodo rende formattati di testo con o senza sinistra e imbottitura destra a seconda del valore del parametro flags
:come ottenere i margini di testo esatto utilizzati da TextRenderer
TextFormatFlags.NoPadding
- si inserisce il testo saldamente il rettangolo di selezione ,TextFormatFlags.GlyphOverhangPadding
- aggiunge alcuni margini sinistro e destro,TextFormatFlags.LeftAndRightPadding
- aggiunge margini ancora più grandi.
Ora, la mia domanda è come posso ottenere l'esatta quantità di imbottitura (sinistra e destra) aggiunto di DrawText
al testo per un dato contesto di periferica, string, font, ecc?
Ho scavato in .NET 4 con .NET Reflector e ho trovato che TextRenderer calcola "overhang padding" che è 1/6 dell'altezza del font e quindi moltiplica questo valore per calcolare i margini sinistro e destro usando questi coefficienti:
- sinistra 1.0, 1.5 per giusta
TextFormatFlags.GlyphOverhangPadding
, - sinistra 2.0, 2.5 per giusta
TextFormatFlags.LeftAndRightPadding
.
I valori risultanti vengono arrotondati per eccesso e passati alle funzioni API native DrawTextExA
o DrawTextExW
. È difficile ricreare questo processo perché l'altezza del font non è presa da System.Drawing.Font
ma da System.Windows.Forms.Internal.WindowsFont
e queste classi restituiscono valori diversi per lo stesso carattere. E sono coinvolte molte altre classi BCL interne dallo spazio dei nomi . Decompilare tutti e riutilizzare il codice nella mia app non è un'opzione, perché sarebbe una seria dipendenza dell'implementazione .NET. Ecco perché ho bisogno di sapere se c'è qualche API pubblica in WinForms o almeno quali funzioni di Windows posso usare per ottenere i valori dei margini sinistro e destro.
Nota: ho cercato di TextRenderer.MeasureText
con o senza imbottitura e confronta i risultati, ma che mi ha dato solo la somma dei margini sinistro e destro e ho bisogno di loro separatamente.
Nota 2: Nel caso in cui ti chiedi perché ho bisogno di questo: io voglio disegnare una stringa con più tipi di carattere/colori. Ciò implica chiamare il DrawText
una volta per ogni sottostringa con formattazione uniforme con l'opzione NoPadding
(in modo che il testo non si diffonda) ma voglio anche aggiungere manualmente il normale GlyphOverhangPadding
all'inizio e alla fine dell'intero testo multi-formato.
+1 per l'analisi completa :-). Ho anche avuto questo problema e i valori di padding sinistro che hai annusato lo hanno risolto per me - grazie. – Fedearne