etwas anspruchsvollere Textausgabe



  • Salve,
    ich möchte gerne in einem bestimmten Bereich einen Textstring horizontal und vertikal zentriert ausgeben.
    Bisher mache ich das mit der Funkion DrawText mit den entsprechenden Flags. Das klappt wie erwartet problemlos.
    Nun möchte ich einige Teile des Textes andersfarbig ausgeben.

    Ich finde dazu keine andere Möglichkeit, als die entsprechenden Passagen einzeln auszugeben. Dazu muss ich dann natürlich für den(die) noch folgenden Teil(e) jeweils wieder eine neue Startposition berechnen.

    Was mir bisher vorschwebt:
    Um den Text zentrieren zu können, mittels GetTextExtentPoint32 die Ausmaße ermitteln.
    Ausgabe der einzelnen Teile mit TextOut nach Setzen der gewünschten Textfarbe.
    Zum Ermitteln der nächsten Ausgabeposition mittels GetTextMetrics die Zeichenbreite feststellen und entsprechend die X-Position anpassen.

    Ist das die richtige Vorgehensweise für mein Vorhaben, oder sollte man das anders (wie?) machen?



  • Das wird nicht funktionieren, weil bei den meisten Schriftarten die Position von der Buchstabenkombination abhängt, nicht nur vom Buchstaben.
    Benutze RichEdit, da kannst du mitten im Text Farben ändern. Du kannst mal Wordpad öffnen, das benutzt einfach nur ein RichEdit und ein RichEdit kann alles was Wordpad kann. Wenn das nicht reicht bringt dir vielleicht Scintilla was.



  • Hi,

    bei mir sieht das in etwa so aus:

    class XML_LINE_CHUNK
    {
    	POINT				position;
    
    	XML_TEXT 			*theElement;
    	STRING				*text;
    
    	XML_VIEWER_BOX_PTR	theInlineBlockBox;
    
    	public:
    	int					width;
    	size_t				startPos, len;
    ...
    };
    
    struct XML_LINE
    {
    	POINT					position;
    	int						lineWidth, lineHeight, maxWidth;
    	ARRAY<XML_LINE_CHUNK>	theLine;
    
    ...
    };
    

    Für jeden Teilbereich ermittele ich die Breite mittels

    GetTextExtentPoint32

    Die Zeilenbreite ist dann die Summe aller Einzelbreiten. Die x-positition ist dann die x-Position des vorhergehenden Elements plus dessen Breite. Bei bekannter Zeilenbreite und Breite des Controls kann man dann ganz leicht den Offset für links-, rechtsbündige oder zentrierte Ausgabe berechnen.

    Man könnte natürlich die Positionen auch relativ speichern, dann müssen die aber beim Redraw oder beim Mouseclick immer wieder umgerechnet werden.

    mfg Martin



  • Danke für die Antworten. Dass die unterschiedliche Zeichenbreite bei Proportionalschriften zum Problem wird, war mir irgendwie klar, ich weiß auch nicht genau, warum ich mich so auf die oben geschilderte Vorgehensweise eingeschossen habe.
    Die Idee, die Breite der einzelnen zusammenhängend auszugebenden Teile einzeln mit GetTextExtentPoint32 festzustellen, hatte ich auch mal kurz, warum auch immer aber nicht weiter verfolgt.

    Danke Martin, Du hast mich wieder auf diese Spur gebracht; vielleicht fand ich es vorher einfach zu aufwendig, ich weiß es nicht mehr.



  • Bezüglich der nicht immer korrekten Arbeitsweise der Funktion "GetTextExtentPoint32" schau dir das mal an:

    http://www.codeproject.com/Articles/14915/Width-of-text-in-italic-font

    Die Informationen dort waren für mein Projekt recht hilfreich.


Log in to reply