Domanda

Sto usando GDI + in C ++. (Questo problema potrebbe verificarsi anche in C #).

Noto che ogni volta che chiamo Graphics :: MeasureString () o Graphics :: DrawString (), la stringa viene riempita con uno spazio vuoto a sinistra e a destra.

Ad esempio, se sto usando un font Courier (non in corsivo!) e misuro " P " Ottengo 90, ma "PP" mi dà 150. Mi aspetterei che un carattere monospace dia esattamente il doppio della larghezza per " PP " ;.

La mia domanda è: è questo comportamento intenzionale o documentato e come posso disabilitarlo?

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;
È stato utile?

Soluzione

È in base alla progettazione, quel metodo non utilizza i glifi effettivi per misurare la larghezza e quindi aggiunge una piccola imbottitura in caso di sporgenze.

MSDN suggerisce di utilizzare un metodo diverso se hai bisogno di maggiore precisione :

  

Per ottenere metriche adatte alle stringhe adiacenti nel layout (ad esempio, quando si implementa il testo formattato), utilizzare MeasureCharacterRanges o uno dei metodi metodi MeasureString che accetta un StringFormat e passa GenericTypographic . Inoltre, assicurati di TextRenderingHint per < a href = "http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" rel = "nofollow noreferrer"> Grafica è AntiAlias ??.

Altri suggerimenti

È vero che è di progettazione, tuttavia il link sulla risposta accettata non è in realtà perfetto. Il problema è l'uso dei float in tutti quei metodi quando ciò che vuoi veramente usare sono i pixel (ints).

La Classe TextRenderer è pensata per questo scopo e funziona con le dimensioni reali. Vedi questo link da msdn per una guida dettagliata all'uso di questo.

Aggiungi StringFormat.GenericTypographic risolverà il tuo problema:

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

Applica lo stesso attributo a DrawString .

Sembra che potrebbe anche essere collegato al suggerimento, in base a questo articolo di KB, Perché il testo appare diverso quando disegnato con GDIPlus contro GDI

TextRenderer è stato ottimo per ottenere la dimensione del carattere. Ma nel ciclo di disegno, l'utilizzo di TextRenderer.DrawText è stato estremamente lento rispetto alla grafica.DrawString ().

Dato che la larghezza di una stringa è il problema, è molto meglio usare una combinazione di TextRenderer.MeasureText e graphics.DrawString ..

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