Forum: PC-Programmierung [C#] Text perfekt zentrieren


von Sam .. (sam1994)


Lesenswert?

Hi

Ich arbeite mich gerade in Managed DirectX mit c# ein. Da ich eine Zahl 
über ein VertexArray zeichnen lassen möchte, habe ich diese erst in ein 
Bitmap geschrieben und in eine Textur übertragen. Nur wie zentriere ich 
den Text perfekt? Irgendwie ist es immer ein bisschen nach unten rechts 
geschoben. Wahrscheinlich liegt das am TextRenderer? Was macht dieser 
falsch bzw. wie korrigiert man diese Ungenauigkeit?
1
//...
2
Size textsize = TextRenderer.MeasureText(str, font);
3
g.DrawString(str, font, new SolidBrush(forecoler), (textsize.Width + points) / 2, (textsize.Height + points) / 2);
4
//...

str ist der Text
font ist der Trommelwirbel Font
forecolor erklärt sich auch selbst
points ist die Größe der Bitmap, sowohl vertikal als auch horinzontal

Ich hab mal ein bisschen rumgespielt. Besser wird es wenn man bei x und 
y font.Size abzieht, aber eben nur ein bisschen, nicht ganz exakt.

von Markus V. (valvestino)


Lesenswert?

Samuel K. schrieb:
> Wahrscheinlich liegt das am TextRenderer? Was macht dieser
> falsch bzw. wie korrigiert man diese Ungenauigkeit?

Die Ungenauigkeit korrigierst Du, indem Du die Position, an der die 
Bitmap gerendert werden soll, richtig berechnest. Mal ein Beispiel:

textsize.Height = 5, points = 10, nach Deiner Berechnung wird die Bitmap 
bei 7,5 positioniert, was ja, wie Du geschrieben hast, zu tief ist (oder 
horizontal zu weit rechts).

Wenn Du aber ( Gesamthöhe - Texthöhe ) / 2 rechnest, kommst Du in meinem 
Beispiel auf 2,5, was richtig wäre.

Gruß
Markus

von bluppdidupp (Gast)


Lesenswert?

Wenn g das Graphics-Dingen ist, könnte dich vllt. auch das hier 
interessieren:
http://msdn.microsoft.com/de-de/library/21kdfbzs.aspx
Mit layoutRectangle gibt man an wohin gezeichnet werden soll, mit format 
kann man vertikale+horizontale Zentrierung einstellen.

von Sam .. (sam1994)


Lesenswert?

Danke an alle. Der letzte Tipp war Gold wert.

So funktioniert es:
1
StringFormat sf = new StringFormat();
2
sf.Alignment = StringAlignment.Center;
3
sf.LineAlignment = StringAlignment.Center;
4
g.DrawString(i.ToString(), f, new SolidBrush(forecoler), new RectangleF(0, 0, points, points), sf);

Vor kurzem hab ich mir noch gedacht die DrawString Mehtode kann doch 
zentrieren, habe es damals aber nicht gefunden.

Markus Volz schrieb:
> textsize.Height = 5, points = 10, nach Deiner Berechnung wird die Bitmap
> bei 7,5 positioniert, was ja, wie Du geschrieben hast, zu tief ist (oder
> horizontal zu weit rechts).

Stimmt, das war der Fehler. Allerdings ist die obige Methode jetzt doch 
einfacher.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.