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.

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); |

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); |

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; |

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); |

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.

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.

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.
|