Text richtig zentrieren mit GDI+

  • .NET (FX) 4.0
  • C#

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    Text richtig zentrieren mit GDI+

    Hey Community,

    ich habe mal wieder eine Art Problem. Ich code momentan meinen SudokuSolver neu, und es geht vorest darum ein schönes Control zu haben. Das Problem dabei sind die Zahlen darin: Bekanntlicher Weise hat ja ein SudokuFeld 81 Felder, und ich kenne die Koordiaten der Mitte (die sind auch richtig!). Wenn ich jetzt mit Tahoma new Font("Calibri", 13, FontStyle.Bold) die Zahlen zeichne, sind sie nicht 100%-ig zentral, ich müsste 1px Offset in beide Richtungen hinzufügen. Liegt das an der Schriftart oder an meinem Code ?:
    Number + Rectangle
    Das erste Bild ist das Resultat von dem Code, das zweite ist dsa gleiche nur halt in Zeile 13 mit new PointF(x+1, y+1). Das Recteck beschreibt nur die Größe des Chars (siehe Code).

    C#-Quellcode

    1. List<int> centers = GetListOfCenters();
    2. int i = 1;
    3. int j = 1;
    4. foreach (int x in centers)
    5. {
    6. foreach (int y in centers)
    7. {
    8. string txt = Sudoku.GetCell(i, j).ToString();
    9. StringFormat sf = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
    10. //Normal
    11. e.Graphics.DrawString(txt, this.Font, new SolidBrush(this.ForeColor), new PointF(x, y), sf);
    12. //Rectangle
    13. SizeF fontsize = e.Graphics.MeasureString(txt, this.Font);
    14. e.Graphics.DrawRectangle(new Pen(Color.Red, 1), x - fontsize.Width / 2, y - fontsize.Height / 2, fontsize.Width, fontsize.Height);
    15. j++;
    16. }
    17. i++;
    18. j = 1;
    19. }


    Spoiler anzeigen

    C#-Quellcode

    1. List<int> centers = GetListOfCenters();
    2. foreach (int x in centers)
    3. {
    4. foreach (int y in centers)
    5. {
    6. //Centers
    7. e.Graphics.DrawRectangle(new Pen(Color.Blue, 1), x - 1, y - 1, 2, 2);
    8. }
    9. }

    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Nimm beim ​Graphics.DrawString die Überladung, welche ein ​RectangleF und ein ​StringFormat annimmt. Dann übergibst du das Zielrectangle und eine Instanz des StringFormat mit ​Align = Center und ​LineAlign = Center. Das sollte den String im Rectangle dann automatisch zentrieren.
    Danke, aber ob ich jz ein RectF nehme oder ein PointF wie bisher, der Offset von 1px müsste so oder so rein.

    EDIT: Ich nehme es zurück, es geht, aber ich versteh nicht warum. Ob ich nun die Mitte des Rechteckes habe oder das Rechteck an sich ?(
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThePlexian“ ()

    Nope, Im MOment übernimmst du alle Berechnungen für Zentrieren, aber das ist unnötig und, wie du bereits festgestellt hast, nicht 100% genau. Lass es GDI selber machen, leg ein Rechteck, dass so groß wie ein Kästchen ist, als FormatRectangle in DrawString fest und gib ein zentrierendes Stringformat an. Die Schrift wird exakt zentriert sein und du sparst dir obendrein noch MeasureString.
    Hab ich jetzt auch (siehe EDIT) aber was macht es für einen Unterschied zu dem hier:

    C#-Quellcode

    1. StringFormat sf = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
    2. e.Graphics.DrawString(txt, this.Font, new SolidBrush(this.ForeColor), new PointF(x, y), sf);


    Liegt das daran das eine Zelle genau 32px groß ist? Und es dementsprechend keine Mitte gibt ? Nur wundere ich mich, wie es dann GDI+ regelt...
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Da du einen Punkt angibst existiert kein wirklicher Bereich, in dem zentriert werden könnte. Wie sich DrawString in sonem Fall dann verhält, weiß ich nicht. Deshalb bei Zentrierten Texten einfach immer ein Rechteck angeben, ist meistens sogar einfacher (auch in dem Fall hier, würde ich meinen).