Domanda

Sto usando i pixel come unità per il mio carattere. In un punto, sto eseguendo un hit test per verificare se l'utente ha fatto clic all'interno del rettangolo di delimitazione di un testo sullo schermo. Per questo devo usare qualcosa come MeasureString . Sfortunatamente, il codice che esegue l'hit test si trova all'interno di una libreria che non ha accesso a un oggetto Graphics o persino a un Control .

Come posso ottenere il rettangolo di selezione di una stringa dato il carattere senza usare la classe Graphics ? Perché ho persino bisogno di un oggetto Graphics quando il mio carattere è in pixel?

È stato utile?

Soluzione

Se si dispone di un riferimento a System.Windows.Forms, provare a utilizzare la classe TextRenderer. Esiste un metodo statico (MeasureText) che accetta la stringa e il carattere e restituisce la dimensione. Link MSDN

Altri suggerimenti

Non è necessario utilizzare l'oggetto grafico che si sta utilizzando per eseguire il rendering per eseguire la misurazione. È possibile creare una classe di utilità statica:

public static class GraphicsHelper
{
    public static SizeF MeasureString(string s, Font font)
    {
        SizeF result;
        using (var image = new Bitmap(1, 1))
        {
            using (var g = Graphics.FromImage(image))
            {
                result = g.MeasureString(s, font);
            }
        }

        return result;
    }
}

Potrebbe essere utile, a seconda della situazione, impostare anche i dpi della bitmap.

Il metodo

MeasureString nella risposta @NerdFury fornirà una larghezza della stringa più elevata del previsto. Ulteriori informazioni sono disponibili qui . Se vuoi misurare solo la lunghezza fisica, aggiungi queste due righe:

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
result = 
  g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic);

Questo esempio fa un ottimo lavoro illustrando l'uso di FormattedText. FormattedText fornisce un controllo di basso livello per il disegno di testo nelle applicazioni Windows Presentation Foundation (WPF). Puoi usarlo per misurare la larghezza di una stringa con un determinato carattere senza usare un oggetto Graphics.

public static float Measure(string text, string fontFamily, float emSize)
{
    FormattedText formatted = new FormattedText(
        item, 
        CultureInfo.CurrentCulture, 
        System.Windows.FlowDirection.LeftToRight, 
        new Typeface(fontFamily), 
        emSize, 
        Brushes.Black);

    return formatted.Width;
}

Includi le librerie WindowsBase e PresentationCore.

Questo potrebbe non essere che una ripetizione degli altri, ma il mio problema era anche l'oggetto grafico indesiderato. Dopo aver ascoltato le frustrazioni di cui sopra ho semplicemente provato:

Size proposedSize = new Size(int.MaxValue, int.MaxValue);
TextFormatFlags flags = TextFormatFlags.NoPadding;
Size ressize = TextRenderer.MeasureText(content, cardfont, proposedSize, flags);

(dove 'content' è la stringa da misurare e cardfont il carattere in cui si trova)

... ed è stato fortunato. Potrei usare il risultato per impostare la larghezza della mia colonna in VSTO.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top