Frage

Ich bin mit GDI + in C ++. (Dieses Problem kann in C # gibt es auch).

Ich stelle fest, dass, wenn ich Graphics :: MeasureString () oder Graphics :: DrawString () aufrufen, wird die Zeichenfolge mit Leerzeichen auf der linken und rechten gepolstert ist.

Zum Beispiel, wenn ich eine Courier-Schrift verwenden, (nicht kursiv!) Und ich messe „P“ I 90, aber „PP“ gibt mir 150. Ich würde eine Monospace-Schrift erwartet genau das geben die doppelte Breite "PP".

Meine Frage ist: ist dies beabsichtigt oder Verhalten dokumentiert, und wie deaktiviere ich das?

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;
War es hilfreich?

Lösung

Es ist durch Design, macht das Verfahren nicht die tatsächlichen Glyphen verwenden, um die Breite zu messen und so fügt eine wenig Polsterung im Fall von Überhängen.

MSDN eine andere Methode schlägt vor, zu verwenden, wenn Sie eine höhere Genauigkeit benötigen :

  

Um Metriken für benachbarte Strings in Layout (zum Beispiel, wenn formatierten Text Implementierung) zu erhalten, verwenden Sie die MeasureCharacterRanges Verfahren oder einer der MeasureString Methoden, die eine String , und übergeben GenericTypographic . Außerdem gewährleisten die TextRenderingHint für die < a href = "http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" rel = "nofollow noreferrer"> Graphics a href = "http <: // msdn.microsoft.com/en-us/library/ssazt6bs.aspx“rel = "nofollow noreferrer"> Antialias .

Andere Tipps

Es ist wahr, die durch Design, aber der Link auf der Antwort akzeptiert ist eigentlich nicht perfekt. Das Problem ist die Verwendung von Schwimmern in all diesen Methoden, wenn, was Sie wirklich wollen, ist Pixel (Ints) werden.

Die TextRenderer- Klasse soll für dieser Zweck und arbeitet mit den wahren Größen. Sehen Sie diese Link von Msdn für einen Durchlauf dieses zu verwenden.

anhängen StringFormat.GenericTypographic wird Ihr Problem beheben:

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

Wenden Sie das gleiche Attribut DrawString.

Klingt wie es auch auf anspielend auf der Grundlage dieses Kbartikel verbinden könnte, Warum Text erscheint anders wenn sie mit GDIPlus im Vergleich zu GDI gezogen

TextRenderer- war für die Größe der Schriftart zu bekommen. Aber in der Zeichnung Schleife war TextRenderer.DrawText mit quälend langsam im Vergleich zu Graphics.DrawString ().

Da die Breite eines Strings ist das Problem, Ihr viel besser mit einer Kombination aus TextRenderer.MeasureText und Graphics.DrawString ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top