Textfunktionen

In dieser Lektion werden wir uns mit der prinzipiellen Ausgabe von Texten befassen. Wie Sie eine bestimmte Schriftart (Zeichensatz, Font) einstellen, das erfahren Sie in in der nächsten Lektion. Alle hier vorgestellten CDC-Methoden arbeiten unabhängig von der aktuell eingestellten Schriftart.

Fangen wir mit der Auswahl der Schriftfarbe an. Um einen Text in einer bestimmten Schriftfarbe auszugeben wird die CDC-Methode SetTextColor(...) aufgerufen. Die Methode erhält als Parameter einen COLORREF-Wert für die Schriftfarbe. Alternativ kann auch hier das Makro RGB(...) hier eingesetzt werden. Standardmäßig ist als Schriftfarbe 'schwarz' eingestellt.

Außer der Schriftfarbe können Sie noch festlegen, ob der Text transparent oder mit ausgefülltem Hintergrund ausgegeben werden soll. Der entsprechende Ausgabemodus wird über die CDC-Methode SetBkMode(...) eingestellt, die Sie schon in der Lektion Stifte & Linien kennen gelernt haben. Das nachfolgende Bild zeigt die Ausgabe von zwei opaque Texten sowie einem transparentem Text. Unter dem Bild sehen Sie den dazugehörigen Auszug aus dem Listing. Der Hintergrund des Fensters wurde mit einem grauen schraffierten Pinsel ausgefüllt. Die im Listing enthaltenen Methode zur Textausgabe werden gleich noch besprochen.

Opaque und transparenter Text

void CTextOutView::OnDraw(CDC* pDC)
{
    ....
    // Schriftfarbe auf blau und Hintergrund auf gelb
    pDC->SetTextColor(RGB(0,0,255));
    pDC->SetBkColor(RGB(255,255,0));
    // opaque Text ausgeben
    nYPos = 10;
    pDC->SetBkMode(OPAQUE);
    pDC->TextOut(10,nYPos,"1. Text opaque");
    nYPos += strTextMetric.tmHeight;
    pDC->TextOut(10,nYPos,"2. Text opaque");
    nYPos += strTextMetric.tmHeight;
    // transparenten Text ausgeben
    pDC->SetBkMode(TRANSPARENT);
    pDC->TextOut(10,nYPos,"Text transparent");
    ....
}

Beachten Sie bitte, dass es sich hier nur um einen Auszug aus einem Listing handelt. Wenn Sie die angegebenen Programmanweisungen so in Ihr eigenes Programm einbauen, werden Sie eine kleiner Schrift und auch einen anderen Fensterhintergrund erhalten. Zudem dürften Sie noch einige Schwierigkeiten mit der Berechnung der Y-Positionen des Textes bekommen. Wie die Y-Position genau berechnet wird erfahren Sie in der nächsten Lektion bei der Behandlung der Zeichensätze.

Sehen wir uns nun die einzelnen Methoden zur Textausgabe an. Die einfachste CDC-Methode zur Textausgabe ist die Methode TextOut(...). TextOut(...) gibt einen Text auf einer in den ersten beiden Parametern anzugebenden Position aus. Beachten Sie bitte, dass es sich hier um logische Koordinaten handelt, d.h. sie sind abhängig vom eingestellten Mapping-Mode (siehe vorhergehende Lektion). Als nächster Parameter folgt der auszugebende Text, entweder als char-Zeiger oder als CString-Objekt. Wird der Text über einen char-Zeiger angegeben, so muss über einen dritten Parameter die Anzahl der auszugebenden Zeichen bestimmt werden.

Geben Sie beim Aufruf der Methode nur den Text als char-Zeiger an, d.h. ohne Angabe der Anzahl der auszugebenden Zeichen, so wird der dort angegebene Text zuerst in ein CString-Objekt gewandelt und dann die TextOut(...) Methode aufgerufen. Wollen Sie einen char-String übergeben, so müssen Sie die Anzahl der Zeichen immer mit übergeben. Die maximale Anzahl der Zeichen beträgt unter WINDOWS9x 8192 Zeichen.

Im Text enthaltene Steuerzeichen wie CR, LF oder TAB werden nicht umgesetzt. So erzeugen z.B. folgenden Anweisungen die darunter dargestellte Ausgabe:

CString m_DemoText = "Ein TAB\tein TAB\tund ein CRLF\n\r und Umlaute: äöüß";
pDC->TextOut(10,30,m_DemoText);

Ausgabe der TextOut(...) Methode

Die nächste, erweiterte Methode zur Textausgabe ist die CDC-Methode ExtTextOut(...). Diese Methode erweitert die TextOut(...) Methode um die Möglichkeit, die Ausgabe auf einen definierten rechteckigen Bereich zu begrenzen, den Ausgabemodus explizit vorzugeben und den Abstand zwischen den einzelnen Buchstaben einzustellen. Der Ausgabemodus kann u.a. durch die Konstanten ETO_CLIPPED und ETO_OPAQUE eingestellt werden. Wird der Wert ETO_CLIPPED gesetzt, so bestimmt das als weiterer Parameter der Methode anzugebende Rechteck den Bereich, innerhalb dessen der Text ausgegeben wird. Der über diesen Bereich hinausragende Text wird abgeschnitten. Die Option ETO_OPAQUE füllt diesen rechteckigen Bereich zusätzlich mit der aktuellen Hintergrundfarbe aus. Wird keine dieser Option gesetzt, so wird der Text mit den aktuellen Einstellungen ausgegeben. Soll für die Textausgabe kein Bereich explizit vorgegeben werden, so kann für den Zeiger auf den Rechteckbereich der Wert NULL übergeben werden. Die Angabe des auszugebenden Textes erfolgt wie bei der TextOut(...) Methode. Der letzte Parameter der Methode ist ein Zeiger auf ein int-Feld, das die Abstände zwischen den einzelnen Zeichen kontrolliert. So legt z.B. der erste Wert des Feldes den Abstand zwischen dem 1. und dem 2. Zeichen fest, der zweite Wert den Abstand zwischen dem 2. und 3. Zeichen usw.. Beachten Sie hierbei aber bitte unbedingt, dass das Feld auch so viele Einträge enthält wie für die Ausgabe des kompletten Textes notwendig sind (strlen(Text)-1 Einträge). Nachfolgend zur Veranschaulichung der Wirkungsweise der Methode wieder ein Auszug aus einem Listing sowie die daraus resultierende Ausgabe:

m_DemoText = "Ein TAB\tein TAB\tund ein CRLF\n\r und Umlaute: äöüß";
CRect CClipRect(0,nYPos,200,nYPos+20);
pDC->ExtTextOut(10,nYPos,ETO_OPAQUE,&CClipRect,m_DemoText,NULL);
nYPos += strTextMetric.tmHeight+20;
// Nicht vergessen, Ausgabebereich ebenfalls zu verschieben!
CClipRect.OffsetRect(0,strTextMetric.tmHeight+20);
pDC->ExtTextOut(10,nYPos,ETO_CLIPPED,&CClipRect,m_DemoText,NULL);

Ausgabe der ExtTextOut(...) Methode

Beachten Sie bei der ersten Ausgabe des Textes, dass auch nur der Teil des Textes mit der aktuellen Hintergrundfarbe hinterlegt wird, der sich innerhalb des angegebenen Bereiches befindet. Der restliche Textteil wird mit dem aktuellen Hintergrund-Modus (hier transparent) ausgegeben.

Geben Sie einen Bereich vor so achten Sie auch darauf, dass der Text darin zu liegen kommt, d.h. Sie müssen die Positionsangabe des Textes und des Rechtecks zur Deckung bringen. Liegt der Text nicht im Bereich, so erhalten Sie natürlich auch keine Ausgabe.

Und auch hier gilt wie bei der vorherigen Methode: im Text enthaltende Steuerzeichen werden nicht umgesetzt.

Erweitern wir die Textausgabe erneut. Die nächste CDC-Methode TabbedTextOut(...) ist in der Lage, im Text enthaltene Tabulatoren zu expandieren. Sonstige Steuerzeichen wie CR oder LF werden aber ebenfalls nicht umgesetzt. Die Angabe der Ausgabeposition und des auszugebenden Textes erfolgt gleich wie bei den bisherigen Methoden. Zusätzlich erhält die Methode nun in einem int-Feld die X-Koordinaten für die einzelnen Tabulatorpositionen übergeben, wobei die Koordinaten in aufsteigender Reihenfolge angegeben werden müssen. Außerdem kann über einen weiteren Parameter die X-Koordinate festgelegt werden, von der aus die Tabulatorpositionen berechnet werden. Zur Verdeutlichung sehen Sie sich dazu bitte das nachfolgende Listing sowie die dazugehörige Ausgabe an. Als Returnwert liefert die Methode den für die Textausgabe benötigten Platz (in logischen Einheiten) zurück.

m_DemoText = "Ein TAB\tein TAB\tund ein CRLF\n\r und Umlaute: äöüß";
// Tabs auf 8-fache Zeichenbreite
pDC->TabbedTextOut(10,nYPos,m_DemoText,0,NULL,0);
nYPos += strTextMetric.tmHeight;
// Tabs auf jede 40. X-Koordinate, X-Start ist 0
int nTabDist = 40;
pDC->TabbedTextOut(10,nYPos,m_DemoText,1,&nTabDist,0);
nYPos += strTextMetric.tmHeight;
// Tabs auf jede 40. X-Koordinate, X-Start ist jetzt 10
pDC->TabbedTextOut(10,nYPos,m_DemoText,1,&nTabDist,10);
nYPos += strTextMetric.tmHeight;

Ausgabe der TabbedTextOut(...) Methode

Zur besseren Übersicht wurden im Ausgabefenster im Abstand von 40 Einheiten senkrechte Striche eingezeichnet. Wenn Sie sich die zweite Zeile betrachten werden Sie feststellen, dass die Tab-Stopps genau an einer 40er Koordinate zu liegen kommen. Bei der 3. Zeile dagegen wurde die Ursprung der Tab-Stops auf die X-Koordinate 10 gelegt, so dass nun die Tab-Stopps an den Position 10, 50, 90, 130 usw. zu liegen kommen.

Sehen wir uns nun noch die letzte, und auch mächtigste, CDC-Methode zur Textausgabe an, die Methode DrawText(...). Die Angabe des Textes erfolgt in gewohnter Weise. DrawText(...) erhält nun aber für die Textpositionierung einen rechteckigen Bereich, innerhalb dessen der Text ausgegeben wird. Am interessantesten ist der letzte Parameter der Methode. Er bestimmt die für die Textausgabe zu verwendende Formatierung. Dieser Parameter kann u.a. eine (sinnvolle) Kombination aus folgenden Konstanten sein:

Konstante

Bedeutung

DT_BOTTOM Der Text wird an der Grundlinie ausgerichtet. Zusätzlich muss die Konstante DT_SINGLELINE mit angegeben werden.
DT_CALCRECT Dient zur Berechnung der Breite und Höhe des Rechtecks, in dem der Text vollständig dargestellt werden kann. Enthält der Text mehrere Zeilen, so wird die durch lpRect vorgegebene Breite für das Ausgabefeld beibehalten und die Höhe entsprechend berechnet. Enthält der Text nur eine Zeile, so wird die Breite des Ausgaberechtecks berechnet. Der Text selbst wird in keinem Fall ausgegeben.
DT_CENTER Gibt den Text zentriert im Ausgabefeld aus.
DT_EXPANDTABS Expandiert Tabulatoren im Text. Standardmäßig werden Tabulatoren auf die 8-fache mittlere Zeichenbreite gesetzt.
DT_EXTERNALLEADING Bindet für die Berechnung der Zeilenhöhe das Datum 'external leading' mit ein. (Siehe dazu auch Grafik am Anfang der nächsten Lektion).
DT_LEFT Richtet den Text linksbündig aus.
DT_NOCLIP Verwendet für die Textausgabe kein Clipping.
DT_NOPREFIX Standardmäßig wird das nach einem &-Zeichen folgende Zeichen unterstrichen ausgegeben. Durch Angabe von DT_NOPREFIX kann dies ausgeschaltet werden. Soll im Standardfall ein &-Zeichen dargestellt werden, so ist dieses Zeichen zu verdoppeln (&&).
DT_RIGHT Richtet den Text rechtsbündig aus.
DT_SINGLELINE Der Text soll unabhängig von CR und LF immer in einer Zeile ausgegeben werden.
DT_TABSTOP Legt fest, dass im High-Byte der Format-Spezifikation die Anzahl der Zeichen pro Tab-Stop definiert ist.
DT_TOP Der Text wird an der Oberkante ausgerichtet. Zusätzlich muss die Konstante DT_SINGLELINE mit angegeben werden.
DT_VCENTER Der Text wird vertikal zentriert ausgerichtet. Zusätzlich muss die Konstante DT_SINGLELINE mit angegeben werden.
DT_WORDBREAK Der Text wird automatisch umgebrochen wenn das nächste Wort über die rechte Grenze des Ausgabebereichs hinausgehen würde. Eine CR/LF Sequenz erzeugt ebenfalls eine neue Zeile.

Sie sehen, diese Methode bietet Ihnen fast alles was Sie für eine formatierte Textausgabe brauchen. Dafür ist dies aber auch die langsamste Ausgabemethode. Und auch hier können Sie sich an Hand des nachfolgenden Listings sowie der dazugehörigen Ausgabe wieder die Wirkungsweise einiger Formatierungsoptionen ansehen.

m_DemoText = "Ein TAB\tein TAB\tund ein CRLF\n\rund Umlaute: äöüß";
// Ausgaberechteck berechnen
CRect CDrawRect(10,nYPos,200,nYPos+50);
// Text linksbündig mit Tabs-Stops auf 8-fache Zeichenbreite
pDC->DrawText(m_DemoText,&CDrawRect,DT_LEFT|DT_EXPANDTABS|DT_WORDBREAK);
// Ausgaberechteck verschieben
CDrawRect.OffsetRect(200,0);
// Text linksbündig mit Tabs-Stops auf 12-fache Zeichenbreite
pDC->DrawText(m_DemoText,&CDrawRect,DT_LEFT|DT_EXPANDTABS|DT_WORDBREAK|DT_TABSTOP|(12<<8));
// Ausgaberechteck verschieben
CDrawRect.OffsetRect(200,0);
// Text ohne Clipping ausgeben
pDC->DrawText(m_DemoText,&CDrawRect,DT_LEFT|DT_EXPANDTABS|DT_WORDBREAK|DT_NOCLIP);

Ausgabe der DrawText(...) Methode

Bei der dargestellten Ausgabe wurde zusätzlich noch das Ausgabefeld mit eingezeichnet um diesen Bereich hervorzuheben. Dieser Bereich wird normalerweise nicht dargestellt.

Zum Schluss dieser Lektion wollen wir noch einige weitere CDC-Methode betrachten die mit der Formatierung von Texten zu tun haben. Für die Methoden TextOut(...) und ExtTextOut(...) kann die Ausrichtung (Alignment) für die Textausgabe mit der Methode SetTextAlign(...) einstellt werden. Die Methode erhält als Parameter eine (sinnvolle) Kombination aus folgenden Konstanten:

Konstante

Bedeutung

TA_BASELINE Die Y-Koordinate bezieht sich auf die Grundlinie des Textes.
TA_BOTTOM Die Y-Koordinate bezieht sich auf die Unterkante des Textes.
TA_TOP Die Y-Koordinate bezieht sich auf die Oberkante des Textes.
TA_CENTER Die X-Koordinaten bezeichnet den Mittelpunkt des Textes.
TA_LEFT Die X-Koordinaten bezeichnet den linken Punkt des Textes.
TA_RIGHT Die X-Koordinaten bezeichnet den rechten Punkt des Textes.
TA_NOUPDATECP Die Position des Grafikcursors wird durch die Textausgabe nicht verändert. Der Text wird an der durch die Parameter x/y spezifizierten Position ausgegeben.
TA_UPDATECP Die Position des Grafikcursors wird durch die Textausgabe verändert. Der Text wird an der aktuellen Position des Grafikcursors ausgegeben. Die x/y Parameter werden ignoriert.

Die Standard Textausrichtung ist TA_LEFT, TA_TOP und TA_NOUPDATECP. Das nachfolgende Bild veranschaulicht die Bedeutung der Konstanten TA_TOP, TA_BASELINE und TA_BOTTOM. Die Y-Koordinate für die Textausgabe wurde durch eine horizontale Linie hervorgehoben.

Textausrichtung

Um den Zwischenraum zwischen den Zeichen einzustellen dient die CDC-Methode SetTextCharacterExtra(...). Sie erhält als Parameter die Anzahl der logischen Einheiten, die zwischen zwei Zeichen zusätzlich eingefügt werden, d.h. mit Hilfe dieser Methode kann auf relativ einfache Weise eine Sperrschrift erzeugt werden. Das nachfolgende Bild zeigt einmal die normale Ausgabe eines Textes und einmal die Ausgabe, wenn zwischen den Zeichen zusätzlich 10 Einheiten eingefügt werden.

Zwischenraum zwischen den Zeichen

Um die 'Sperrschrift' wieder aufzuheben, ist für den Zwischenraum der Wert 0 zu übergeben. Dies ist übrigens auch die Defaulteinstellung.

Es gibt noch eine weitere Methode SetTextJustification(...) um die sogenannten Break-Zeichen in der Breite anzupassen. Break-Zeichen sind Zeichen die zwei Wörter trennen. Das Standard Break-Zeichen ist das Leerzeichen. Mit Hilfe dieser Methode kann z.B. Text im Blocksatz (linker und rechter Rand bündig) ausgegeben werden

Fast alle bisher aufgeführten Set-Methode besitzen entsprechende Get-Methoden um die aktuelle Einstellung abzufragen. So gibt es als Gegenstück zu SetTextCharacterExtra(...) auch eine Methode GetTextCharacterExtra(...). Ein der wichtigsten Get-Methoden (die ausnahmsweise keine entsprechende Set-Methode besitzt) ist die Methode GetTextExtent(...). Sie liefert die Ausdehnung des als Parameter übergebenen Textes in logischen Einheiten zurück. Für die Berechnung der Ausdehnung wird der aktuelle Zeichensatz (siehe mehr dazu gleich in der nächsten Lektion) verwendet. Enthält der Text auch Tabulatoren so muss anstelle der GetTextExtent(...) die Methode GetTabbedTextExtent(...) aufgerufen werden. Mehr zu dieser Methode entnehmen Sie bitte aus der Online-Hilfe.

Damit beenden wir die Textausgabe und wenden uns in der nächsten Lektion den Zeichensätzen zu.



Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470