Quartz: Text erscheint viel zu groß!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Quartz: Text erscheint viel zu groß!

    Hallo,

    ich übertrage derzeit einige ältere Programme, die ich mit Carbon gemacht habe, auf Cocoa. Dabei gibt es immer wider Probleme. Hier mein aktuelles.

    ich zeichne verschiedene Dinge in einen View eines Fensters. Wenn ich zum Beispiel ein Rechteck zeichne, dann erscheint das in der korrekten Größe; zeichne ich aber einen Text, dann erscheint der um ein Vielfaches zu groß.

    Ich rufe die "drawRect"-Methode des Views auf, die es im Beispiel des Kapitels "Graphices Context" des "Quartz 2D Programming Guide" aufgeführt ist. Zunächst eichne ich ein Quadrat mit der Kantenlänge 100, dann will ich den Text "Test" zeichnen mit der Textgröße 12. Während das Quadrat in der korrekten Größe erscheint, ist der Text um ein Vielfaches zu groß (ich füge einen Screenshot im Anhang bei)!

    Nach dem Zeichnen des Quadrats rufe ich die Funktion zur Auswahl des Fonts und der Font Size auf:

    CGContextSelectFont (cgContext, "Arial", 12, kCGEncodingMacRoman);


    dann wird der Text gezeichnet:

    CGContextShowTextAtPoint (cgContext, 10.0, 150.0, "Test", strlen("Test"));


    Ich habe herausgefunden, dass der Text in der richtigen Größe gezeichnet wird, wenn ich die Font Size in "CGContextSelectFont" mit dem Faktor 0.08 multipliziere, also:

    CGContextSelectFont (cgContext, "Arial", 12.0 * 0.08, kCGEncodingMacRoman);


    Das kann aber doch nicht sein. Woran kann das liegen? Kennt sich da jemand aus?

    Hier mein kompletter Code:

    -(void) drawRect: (NSRect) rect

    {



    CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort];



    // Quadrat zeichnen

    CGContextSetRGBFillColor (cgContext, 0, 0, 1, 1);

    CGContextFillRect (cgContext, CGRectMake (50, 50, 100, 100));



    // Text zeichnen

    CGContextSetAllowsAntialiasing (cgContext, true);

    CGContextSetRGBFillColor (cgContext, 0, 0, 0, 1);



    CGContextSelectFont (cgContext, "Arial", 12, kCGEncodingMacRoman); // so erscheint der Text viel zu groß

    //CGContextSelectFont (cgContext, "Arial", 12.0 * 0.08, kCGEncodingMacRoman); // so erscheint der Text in der richtigen Größe



    CGContextShowTextAtPoint (cgContext, 10.0, 150.0, "Test", strlen("Test"));



    }
  • Rainer Bürck schrieb:

    Ja, dann erscheint er an der richtigen Stelle. Ich verwende in meinen Fenstern Rechtecke zum Eingeben von Parametern; die erscheinen dann beim Faktor 0.08 an der richtigen Stelle. HAst Du eine Ahnung, wo das Problem liegt?


    CGContextSelectFont verlangt die Größe "in text space units". Was das genau ist, weiss ich im Moment auch nicht.
    Hast Du gemerkt, dass 12 * 0.08 annähernd 1 ergibt?

    Eventuell könnte eine Transformation Dir helfen
    I would be embarrassed if they did not spy on me.
  • Hallo,

    longW schrieb:

    CGContextSelectFont verlangt die Größe "in text space units". Was das genau ist, weiss ich im Moment auch nicht.
    das findet man in der Quartz "D Reference auch nicht richtig erklärt. Ich habe allerdings diese "CGCSelectFont"-Routine schon oft angewendet, und der Text war immer in der korrekten Größe. Warum das nun so daneben ist, kann ich mir nicht erklären.

    longW schrieb:

    Hast Du gemerkt, dass 12 * 0.08 annähernd 1 ergibt?
    Ja, das ist mir natürlich auch aufgefallen! Aber das würde bedeuten, dass die Font Size mit 1 den Text in derselben Größe zeichnet wie normalerweise mit dem Wert 12. Der Text erscheint also umden12-fachen Wert skaliert. Warum? die restliche Grafik ist ja nicht skaliert. Hm.....
  • Ach so, Du meinst also, dass die Fontgröße auch von der Größe des drawRect abhängt? Das wäre ja der Hammer, denn die anderen Einheiten - etwa beim Zeichnen eines Quadrats, hängen nicht davon ab. Ich werde dem nachgehen. Inzwischen habe ich für das Zeichnen eines Fensters eine andere Lösung gefunden, indem ich einen CGContext mithilfe von NSGraphicsContext *currentNSGraphContext = [NSGraphicsContext graphicsContextWithWindow: self]; erzeuge; da geht das dann ohne Probleme. Da hatte ich allerdings das Problem, dass das Fenster nicht immer upgedated wurde, aber gestern habe ich herausgefunden, dass das mittels CGContextFlush (cgContext); geht (ich hatte das Problem kürzlich im Forum geschikdert).


    Jedenfalls danke für Deinen Tipp; ich werde dem nachgehen,

    Rainer
  • habe eben in der Reference nachgeschaut:

    "When you first create a graphics context, it initializes the text matrix to the identity matrix; thus text space coordinates are initially the same as user space coordinates."



    Wenn ich also nicht explizit eine textmatrix gesetzt habe, dann müssten deren Koordinaten automatisch identisch sein mit den Koordinaten des "user space".
  • Rainer Bürck schrieb:

    habe eben in der Reference nachgeschaut:

    "When you first create a graphics context, it initializes the text matrix to the identity matrix; thus text space coordinates are initially the same as user space coordinates."



    Wenn ich also nicht explizit eine textmatrix gesetzt habe, dann müssten deren Koordinaten automatisch identisch sein mit den Koordinaten des "user space".



    IRGENDWO wird IRGENDWER das eben verändern.
    es kann aber auch ein bug sein (was ich weniger glaube). also einfach sicherheitshalber wieder die identity matrix setzen ;)
  • gritsch schrieb:

    Rainer Bürck schrieb:

    habe eben in der Reference nachgeschaut:

    "When you first create a graphics context, it initializes the text matrix to the identity matrix; thus text space coordinates are initially the same as user space coordinates."



    Wenn ich also nicht explizit eine textmatrix gesetzt habe, dann müssten deren Koordinaten automatisch identisch sein mit den Koordinaten des "user space".



    IRGENDWO wird IRGENDWER das eben verändern.
    es kann aber auch ein bug sein (was ich weniger glaube). also einfach sicherheitshalber wieder die identity matrix setzen ;)

    Das ist auch meine Meinung. Irgendwie ist die zusätzliche Textmatrix verändert worden.
    Ich würde aber vorsichtshalber das mit 'CGContextGetTextMatrix()' untersuchen.
    Eine Verdachtsstelle wäre z.B. selectFont, wo implizit etwas verstellt worden sein könnte.
    I would be embarrassed if they did not spy on me.
  • longW schrieb:

    gritsch schrieb:

    Rainer Bürck schrieb:


    Wenn ich also nicht explizit eine textmatrix gesetzt habe, dann müssten deren Koordinaten automatisch identisch sein mit den Koordinaten des "user space".
    Kann mir jemand sagen, wie ich diese identity matrix setzen kann? Gibt es da eine einfache Methode?



    IRGENDWO wird IRGENDWER das eben verändern.
    es kann aber auch ein bug sein (was ich weniger glaube). also einfach sicherheitshalber wieder die identity matrix setzen ;)

    Das ist auch meine Meinung. Irgendwie ist die zusätzliche Textmatrix verändert worden.
    Ich würde aber vorsichtshalber das mit 'CGContextGetTextMatrix()' untersuchen.
    Eine Verdachtsstelle wäre z.B. selectFont, wo implizit etwas verstellt worden sein könnte.

    longW schrieb:

    RGENDWO wird IRGENDWER das eben verändern.
    es kann aber auch ein bug sein (was ich weniger glaube). also einfach sicherheitshalber wieder die identity matrix setzen ;)
  • Etwa so:

    Quellcode

    1. CGContextSetTextMatrix(context, CGAffineTransformIdentity);

    'CGAffineTransformIdentity'' ist eine Konstante.

    Sieht ja wild aus, Dein letzter Beitrag. Das letzte Zitat stammt nicht von mir, sondern von "gritsch".
    Dein Beitrga dort war, glaube ich:
    Kann mir jemand sagen, wie ich diese identity matrix setzen kann? Gibt es da eine einfache Methode?
    I would be embarrassed if they did not spy on me.
  • Rainer Bürck schrieb:

    Ja, sorry, da ist irgendetwas beim Zitierten schiefgelaufen. Habe es erst bemerkt, als die Antwort schon abgeschickt war. Also die Frage war: kann mir jemand sagen, wie man diese identity matrix setzt?

    Ok.

    Die Antwort steht schon da. Du musst in der Funktion nur Deinen Kontext richtig einsetzen.
    Ich habe nicht geschaut, wie die Variable bei Dir benannt ist.
    I would be embarrassed if they did not spy on me.
  • longW schrieb:

    Die Antwort steht schon da. Du musst in der Funktion nur Deinen Kontext richtig einsetzen.
    Ich habe nicht geschaut, wie die Variable bei Dir benannt ist.
    Ich habe in drawRect zunächst den CGContext erzeugt mit:

    CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort];


    und dann eben meine Funktionen fürs Zeichnen angefügt. Typ CGAffineTransform

    Wenn ich CGContextSetTextMatrix anwenden will, dann muss ich als erste Variable diesen cgContext angeben, als zweite Variable eine Variable vom Typ CGAffineTransform. Was muss ich da eingeben, um die identity matrix zu bekommen? Oder muss ich da eine andere Methode anwenden?
  • Sorry, da ist wieder etwas verrutscht. Mein TExt lautet korrekt so:

    Ich habe in drawRect zunächst den CGContext erzeugt mit:

    CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort];

    und dann eben meine Funktionen fürs Zeichnen angefügt.

    Wenn ich CGContextSetTextMatrix anwenden will, dann muss ich als erste Variable diesen cgContext angeben, als zweite Variable eine Variable vom Typ CGAffineTransform. Was muss ich da eingeben, um die identity matrix zu bekommen? Oder muss ich da eine andere Methode anwenden?
  • nur zu dener info:

    1. du erstellst den context nicht sondern holst dir nur einen bestehenden (und da ises sehr gut dass irgend ein anderer code (nicht unbedingt von dir) die text-matrix geändert hat)

    2. es gibt einen "Bearbeiten"-Button hier im forum mit dem du deine beiträge im nachhinein noch bearbeiten kannst!