MeasureString() pastiglie il testo a sinistra e destra

Sto utilizzando GDI+ in C++. (Questo problema potrebbe esistere in C# troppo).

Ho notato che ogni volta che io chiamo Grafica::MeasureString() o la Grafica::DrawString(), la stringa è imbottito con spazio vuoto a destra e a sinistra.

Per esempio, se sto utilizzando un tipo di carattere Courier, (non in corsivo!) e mi misura “P” mi sono 90, ma “PP” è per me 150. Mi sarei aspettato un carattere a spaziatura fissa per dare esattamente il doppio della larghezza per “PP”.

La mia domanda è: è questo inteso o documentato il comportamento, e come faccio a disattivare questo?

RectF Rect(0,0,32767,32767);
RectF Bounds1, Bounds2;
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1);
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2);
margin = Bounds1.Width * 2 - Bounds2.Width;
InformationsquelleAutor Tim Cooper | 2008-09-23



5 Replies
  1. 11

    È by design, che un metodo che non uso effettivo glifi per misurare la larghezza e quindi aggiunge un po ‘ di imbottitura in caso di sporgenze.

    MSDN suggerisce di utilizzare un metodo diverso se avete bisogno di più precisione:

    Per ottenere metriche adatto per corde adiacenti nel layout (ad esempio, quando l’attuazione di testo formattato), utilizzare il MeasureCharacterRanges metodo o uno dei MeasureString metodi che prende un StringFormat, e passare GenericTypographic. Inoltre, verificare che la TextRenderingHint per il Grafica è AntiAlias.

  2. 6

    È vero che è il design, tuttavia il legame con il accettato la risposta, in realtà non è perfetto. Il problema è l’uso di carri in tutti questi metodi quando ciò che si vuole veramente essere in uso è il pixel (int).

    Il Classe TextRenderer è pensato per questo scopo e funziona con le vere dimensioni. Vedere questo link da msdn per una procedura dettagliata dell’utilizzo di questo.

    • I migliori risultati con TextRenderer classe.
    • TextRenderer era esattamente quello di cui avevo bisogno in una situazione simile
    • TextRenderer funzionato molto meglio anche per me
  3. 5

    Aggiungere StringFormat.GenericTypographic risolvere il tuo problema:

    graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic);
    

    Applicare lo stesso attributo di DrawString.

    • GenericTypographic è l’ideale per me, perché sto usando il mio stesso margine nel controllo comunque.
    • Quasi perfetto, ma il piccolo imbottiture sono necessari.
  4. 0

    TextRenderer è stato grande per raggiungere la dimensione del carattere. Ma nel disegno loop utilizzando TextRenderer.DrawText era terribilmente lento rispetto alla grafica.DrawString().

    Dal momento che la larghezza di una stringa è il problema, è molto meglio usare una combinazione di TextRenderer.MeasureText e grafica.Coulisse..

Lascia un commento