Zeichnen - Textlänge



  • Hallo alle im Forum,

    wer kann mir sagen, wie man die Länge eines Textes herausbekommt.

    Ich meine nicht die Anzahl der Zeichen sondern die Länge der Ausgabe auf dem Bildschirm bzw. auf dem Drucker entsprechend der Schriftart und Schriftgröße.

    MfG

    A.Behncke



  • siehe

    CSize CDC::GetOutputTextExtent( CString )
    

    für mehrzeilige Texte nehm ich dies:

    CRect rect( 0, 0, 1, 1 );
    CString text( "BlaBla" );
    pDC->DrawText(text, rect, DT_CALCRECT | DT_LEFT );
    

    ich bin mir jetzt nicht sicher, ob du bei text und rect den Adressoperator brauchst. Probiere. Auf jeden Fall ist DT_CALC wichtig. Natürlich kannst du auch DT_BUTTON oder sowas dazu verknüpfen. Das rect darf nicht (0,0,0,0) beim Aufruf sein und enthält nach dem Aufruf das umschließende Rechteck. Aber eigentlich nur die Breite und Höhe. Das sich pDC auf dein Zielgerät bezieht und vorher dort die (zum DC passende!!) Schrift gesetzt sein muss, versteht sich von alleine.

    mfg [img]images/smiles/icon_smile.gif[/img] MaLi



  • Danke,

    aber dieses ist nur ein Teil meiner Probleme,

    Einmal will ich Beträge untereinander ausdrucken, also ',' unter ',' und weiter will ich längere Texte ausgeben, natürlich mit Seitenumbruch. Daher muß ich die Anzahl der Zeilen vorher wissen. Ebenso verhält es sich mit der Textlänge. Der Ausdruck sollte eigendlich aus das Papier passen.

    Derzeit werden in meinem Programm die einzelnen Drucksequenzen in eine Stuktur geschrieben, die wiederum in ein CList-Objekt aufgenommen wird. Einzelne Positionen werden in temporäre CList-Objekte geschrieben, man weiß ja nicht wie lang diese werden, und abhängig von der Restlänge der Seite und der Länge der Position auf die aktuelle Seite bzw. es wird ein Seitenumbruch nach den Regeln des Schriftverkehr eingefügt und die Position auf der nächsten Seite ausgegeben.

    Mein Problem liegt folglich darin, auch bei einem DAU (dümmster anzunehmende User), einen eingegebenen Freitext so auszugeben, dass das ganze noch gut aussieht, also je nach Textlänge und zur Verfügung stehenden Platz die Position auf die aktuelle Seite, die nächste Seite oder auch auf mehrere Seiten auszugeben.

    Vielleicht fällt Dir oder jemanden ander etwas ein, was mich etwas weiter bringt.

    A.Behncke



  • Hallo,

    der Beitrag von MaLi hat mir den Anstoß zum weiteren Testen gebracht.
    Der Test

    CSize breite;
    breite = pDC->GetOutputTextExtent( "iiiiiiiiiiiiiii", 15 );
    pDC->TextOut( breite.cx, breite.cy-200, "iiiiiiiiiiiiiii");
    pDC->TextOut( breite.cx+breite.cx, breite.cy-breite.cy-200, "iiiiiiiiiiiiiii");
    breite = pDC->GetOutputTextExtent( "mmmmmmmmmmmmmmmmm", 17 );
    pDC->TextOut( breite.cx, breite.cy-300, "mmmmmmmmmmmmmmmmm");
    pDC->TextOut( breite.cx+breite.cx, breite.cy-breite.cy-300, "mmmmmmmmmmmmmmmmm");
    breite = pDC->GetTextExtent( "iiiiiiiiiiiiiii", 15 );
    pDC->TextOut( breite.cx, breite.cy-400, "iiiiiiiiiiiiiii");
    pDC->TextOut( breite.cx+breite.cx, breite.cy-breite.cy-400, "iiiiiiiiiiiiiii");
    breite = pDC->GetTextExtent( "mmmmmmmmmmmmmmmmm", 17 );
    pDC->TextOut( breite.cx, breite.cy-500, "mmmmmmmmmmmmmmmmm");
    pDC->TextOut( breite.cx+breite.cx, breite.cy-breite.cy-500, "mmmmmmmmmmmmmmmmm");

    in void CView::OnPrint(CDC* pDC, CPrintInfo* pInfo) bracht die Erkenntnis, das pDC->GetTextExtent() genau das richtige ist.

    Danke

    A.Behncke


Anmelden zum Antworten