Zeichensätze
Bevor wir darauf eingehen wie für die Ausgabe von Texten ein bestimmter Zeichensatz
(Font) ausgewählt wird, müssen zunächst einige Grundbegriffe erläutert werden. Unter
WINDOWS ist ein Zeichensatz ein relativ kompliziertes Gebilde, das eine Reihe von
Kenndaten besitzt. Sehen Sie sich dazu zunächst das folgende Bild an:

Im Bild sind einige Kenndaten eines Zeichensatzes dargestellt, die gleich noch
behandelt werden. Um die Kenndaten des aktuell eingestellten Zeichensatzes
zu ermitteln wird die CDC-Methode GetTextMetrics(...) aufgerufen.
Diese Methode erhält als Parameter einen Zeiger auf eine Struktur vom Typ TEXTMETRIC
übergeben. War der Aufruf erfolgreich, stehen danach in der übergebenen Struktur
die Kenndaten zur Verfügung. Sehen wir uns diese, nicht ganz kleine, Struktur einmal
an:
typedef struct tagTEXTMETRIC
{
int tmHeight;
int tmAscent;
int tmDescent;
int tmInternalLeading;
int tmExternalLeading;
int tmAveCharWidth;
int tmMaxCharWidth;
int tmWeight;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmFirstChar;
BYTE tmLastChar;
BYTE tmDefaultChar;
BYTE tmBreakChar;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
int tmOverhang;
int tmDigitizedAspectX;
int tmDigitizedAspectY;
} TEXTMETRIC; |
Das Element tmHeight gibt die Schriftgröße in point (pt) an. 1 point
entspricht .013837 inch. Wenn Sie z.B. in einem Editor einen Zeichensatz auswählen,
so erfolgt dort die Größenangabe ebenfalls in point. Diese Schriftgröße setzt sich
nun aus den Werten tmAscent (Schriftraum über der Grundlinie) und tmDescent
(Schriftraum unterhalb der Grundlinie) zusammen. tmInternalLeading gibt
den Raum zwischen der Obergrenze des Zeichens und der Oberkante des Zeichenraums
an. tmExternalLeading definiert den Zwischenraum zwischen zwei Ausgabezeilen
den der Designer der Schrift vorgesehen hat. Der Bereich tmExternalLeading
selbst gehört nicht zur Schrift, d.h. wenn Sie Text mit opaquen Hintergrund ausgeben
wird dieser Bereich nicht mit mit der Hintergrundfarbe ausgefüllt. tmAveCharWidth
und tmMaxCharWidth definieren die mittlere bzw. maximale Breite der Zeichen
im Zeichensatz (Stichwort: Proportionalschrift). Das nächste Element tmWeight
enthält die Schriftdicke; mehr dazu später beim Einstellen eines bestimmten Zeichensatzes.
Die Elemente tmItalic, tmUnderlined und tmStruckOut sind dann
ungleich 0, wenn die eingestellte Schrift kursiv, unterstrichen oder durchgestrichen
ist. Auf die restlichen Elemente der Struktur wird an dieser Stelle nicht weiter
eingegangen. Ihre Bedeutung ist bei Bedarf der Online-Hilfe zur TEXTMETRIC
Struktur zu entnehmen.
Kommen wie nun zu den Zeichensätzen. WINDOWS kennt vier unterschiedliche Zeichensatz-Arten:
Raster-Fonts, Vektor-Fonts, TrueType-Fonts und OpenType-Fonts. Die Zeichensatz-Arten
unterscheiden sich in der Art und Weise, wie das Aussehen der Zeichen abgelegt ist.
Bei Raster-Fonts wird ein Zeichen als Bitmap abgelegt. Diese Zeichenart besitzt
eine genau definierte Größe. Wird eine andere Zeichengröße als die ursprüngliche
Größe verwendet, so erscheinen die Zeichen als 'Blockgrafik', d.h. die Linien des
Zeichens besitzen ein treppenförmiges Aussehen. Anders dagegen die Vektor-Fonts.
Hier wird jedes Zeichen aus Liniensegmente (Richtung und Länge einer Linie) zusammengesetzt.
Eine Größenänderung des Zeichens bewirkt eine Neuberechnung der Endpunkte der einzelnen
Liniensegmente. Zeichen dieser Art lassen sich ohne Qualitätsverlust in beliebiger
Größe darstellen, benötigen aber am meisten Rechenzeit zur Textdarstellung. Bei
TrueType- und OpenType-Fonts bestehen die Zeichen aus Linien- und Kurvensegmente
sowie zusätzliche Hilfspunkte, die eine beliebige Skalierung ohne Qualitätsverlust
erlauben. OpenType-Fonts sind eine Erweiterung der bekannten TrueType-Fonts. Sie
erlauben auch die Darstellung der Zeichen unter Postscript. Alle Zeichensätze sind
in Font-Ressource Dateien abgelegt. Fontdateien mit Raster- und Vektor-Fonts besitzen
die Extension .FON und TrueType- und OpenType-Fonts die Extensions .FOT und .TTF.
Intern organisiert WINDOWS Zeichensätze in so genannten Font-Familien. Eine Font-Familie
ist eine Gruppe von Zeichensätzen, die eine gemeinsame Strichdicke und Serifen-Charakteristik
besitzen. Serifen sind übrigens Verschnörkelungen wie sie z.B. bei der Schriftart
Times Roman vorhanden sind. WINDOWS kennt folgende fünf Font-Familien (eigentlich
sind es ja mit FF_DONTCARE sechs):
|
Fontfamilie
|
Beschreibung
|
| FF_DECORATIVE |
Verzierte Zeichensatz wie
z.B. Old English |
| FF_MODERN |
Zeichensatz mit festem Zeichenabstand,
mit oder ohne Serifen wie z.B. Courier New |
| FF_ROMAN |
Zeichensatz mit proportionalem
Zeichenabstand und Serifen wie z.B. Times New Roman |
| FF_SCRIPT |
Zeichensatz mit Handschrift
ähnlichem Aussehen wie z.B. Script |
| FF_SWISS |
Zeichensatz mit proportionalem
Zeichenabstand und ohne Serifen wie z.B. Arial |
| FF_DONTCARE |
allgemeiner Zeichensatz
wenn keine Daten über den Zeichensatz existieren oder aber die Daten beliebig
sind |
Die in der Spalte Font-Familie aufgeführten Konstanten werden nachher noch für
die Definition des zu verwendenden Zeichensatzes benötigt.
Als dritte, und auch letzte Kennung des Zeichensatz verwendet WINDOWS die so
genannten Character-Sets. Character-Sets enthalten die einzelnen Zeichen, wobei
jedes Zeichen durch einen eindeutige Index gekennzeichnet wird; so wird z.B. der
Buchstabe 'A' in der Regel durch den Index 0x41 (ja, das ist der ASCII-Code) gekennzeichnet.
WINDOWS kennt folgende Character-Sets:
|
Char-Set
|
Beschreibung
|
| Windows |
Entspricht im Prinzip dem
bekannten 8 Bit breiten ASCII-Zeichensatz. Das erste Zeichen im Zeichensatz
ist das Blank (0x20) und das letzte Zeichen das Zeichen mit dem Code 0xFF. |
| Unicode |
Nicht unter WINDOW95/98
verfügbar sondern nur unter NT/2000. Ein Zeichen wird hier durch einen 16-Bit
Wert repräsentiert, so dass z.B. auch chinesische Zeichen darstellbar sind. |
| OEM (original
equipment manufacturer) |
8-Bit breiter Zeichensatz,
dessen Zeichen mit den Codes 0x20..0x7F dem Windows-Zeichensatz entsprechen.
Die Zeichen von 0x00..0x1F und 0x80..0xFF unterscheiden sich vom Windows-Zeichensatz.
Dieser Zeichensatz wird z.B. dazu verwendet, um Texte im Vollbild DOS-Modus
auszugeben. |
| Symbol |
8-Bit Zeichensatz für Symboldarstellungen. |
| Gerätespezifisch |
Zeichensatz der für ein
bestimmtes Gerät gültig ist wie z.B. der EBCDIC-Zeichensatz. |
Nachdem Sie so viel über Zeichensätze erfahren haben, wollen wir uns nun im Rest
dieser Lektion ansehen wie man für Textausgaben einen bestimmten Zeichensatz auswählt.
Anfangen wollen wir auch hier wieder mit dem einfachsten Fall, dass ein von WINDOWS
vordefinierter Zeichensatz eingesetzt werden soll. Um einen dieser Zeichensätze
auszuwählen wird die bereits bekannte CDC-Methode SelectStockObject(...)
aufgerufen. Als Parameter ist der gewünschte Zeichensatz anzugeben der eine der
folgenden Konstanten sein kann: ANSI_FIXED_FONT, ANSI_VAR_FONT,
DEVICE_DEFAULT_FONT, OEM_FIXED_FONT und SYSTEM_FONT. Das
nachfolgende Bild zeigt die verschiedenen Zeichensätze:

Beachten Sie bitte, dass Sie die Höhe einer Textzeile (gleich tmHeight
Element der TEXTMETRIC-Struktur) immer neu berechnen müssen wenn Sie Textausgaben
mit verschiedenen Zeichensätzen vornehmen und die Zeilen nahtlos aneinander anschließen
sollen.
 |
Damit Sie nun endlich wieder etwas zu tun bekommen, versuchen
Sie einmal die nachfolgend dargestellte Ausgabe hinzubekommen.

Die beiden ersten Zeilen sind mit dem Zeichensatz ANIS_VAR_FONT auszugeben
und die beiden letzten Zeilen mit dem SYSTEM_FONT. Beachten Sie dabei bitte,
dass der Text mit einem grauen Hintergrund auszugeben ist und die einzelnen
Zeilen sich nahtlos aneinanderfügen sollen.
Erstellen Sie für diese Übung mittels des Assistenten ein neues SDI-Projekt
mit dem Namen Fonts.
 |
Wenn Sie genug geschwitzt haben kann ich Ihnen auch meine Lösung anzeigen. |
Lösung zur Ausgabe mit Zeichensätzen
void CFontsView::OnDraw(CDC*
pDC)
{
CFontsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten
hinzufügen
// Zeichenfarbe auf
blau setzen
pDC->SetTextColor(RGB(0,0,255));
// Hintergrund auf hellgrau
setzen
pDC->SetBkColor(RGB(0xc0,0xc0,0xc0));
pDC->SetBkMode(OPAQUE);
// Zeichensatz auf proportional
ANSI
pDC->SelectStockObject(ANSI_VAR_FONT);
// Y-Postion der Ausgabe
int
nYPos = 10;
// Zuerst Hoehe des
akt. Zeichensatzes auslesen
TEXTMETRIC
strFontData;
pDC->GetTextMetrics(&strFontData);
// 1. Zeile ausgeben
pDC->TextOut(10,nYPos,"Emil
Maier",10);
// Y-Position der nächsten
Zeile berechnen
nYPos += strFontData.tmHeight;
// 2. Zeile ausgeben
pDC->TextOut(10,nYPos,"Kurze
Gasse 10",14);
// Y-Position der nächsten
Zeile berechnen
nYPos += strFontData.tmHeight;
// Nun Zeichendatz auf
System-Font umstellen
pDC->SelectStockObject(SYSTEM_FONT);
// 3. Zeile ausgeben
pDC->TextOut(10,nYPos,"12345
AStadt",12);
// Hoehe des akt. Zeichensatzes
auslesen
pDC->GetTextMetrics(&strFontData);
// Y-Position der nächsten
Zeile berechnen
nYPos += strFontData.tmHeight;
// 4. Zeile ausgeben
pDC->TextOut(10,nYPos,"Deutschland",11);
} |
Die Einstellung der Textfarben sowie des richtigen Zeichensatzes dürfte
keine Schwierigkeit bereitet haben. Die einzige Schwierigkeit bei dieser
Übung lag eigentlich in der Berechnung der Y-Position für die nachfolgende
Zeile. Wenn Sie den Zeichensatz wechseln, so muss die erste Zeile mit dem
neuen Zeichensatz noch mit dem alten Textabstand ausgegeben werden. Erst
danach dürfen Sie die Zeichenhöhe des neuen Zeichensatzes für die Berechnung
der nächsten Zeile verwenden.
Haben Sie bei der TextOut(...) Methode auch immer die Textlänge
mit angegeben? Wenn nicht, wird das Programm trotzdem richtig funktioniert
haben. Nur wird dann jedes Mal bei der Ausgabe zuerst der Text in ein
CString-Objekt konvertiert und dieser dann ausgegeben.
Ende der Lösung
|
|
Wollen Sie einen anderen Zeichensatz wie z.B. Arial auswählen, so
haben Sie 'etwas' mehr Arbeit zu leisten. Sie müssen WINDOWS genau mitteilen, welchen
Zeichensatz Sie wie darstellen wollen, d.h. Sie müssen die Kenndaten des gewünschten
Zeichensatzes angeben. Diese Kenndaten werden in der Struktur LOGFONT zusammengefasst
die folgenden Aufbau besitzt:
typedef struct tagLOGFONT
{
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
CHAR lfFaceName[LF_FACESIZE];
} LOGFONT; |
Sehen wir uns den Aufbau der Struktur nun an, da Sie ohne Kenntnis der Struktur
keinen beliebigen Zeichensatz einstellen können. Zunächst einmal bestimmt das Element
lfHeight die Höhe des Zeichensatzes in logischen Einheiten. Damit das Ganze
auch nicht zu einfach wird, gibt es hier drei Möglichkeiten. Wird eine Höhe größer
'0' angegeben, so bezieht sich die Höhe auf die Höhe der Zeichenzelle, d.h. auf
tmHeight+tmInternalLeading (siehe Anfang der Lektion). Wird die Höhe mit
'0' vorgegeben, wir eine Standardgröße des gewünschten Zeichensatzes ausgewählt
(was auch immer das ist). Bei einer Höhe kleiner '0' hingegen bezieht sich die angegebene
Höhe auf die Zeichenhöhe, d.h. auf tmHeight. In allen drei Fällen wird
durch den Font-Mapper die Schriftgröße einstellt, die der gewünschten am nächsten
kommt ohne diese aber zu überschreiten.
Das nächste Element lfWidth legt die durchschnittliche Zeichenbreite
fest. Wird hier der Wert '0' angegeben, so wird die Schrift mit der Breite dargestellt,
die proportional zur Höhe ist.

lfEscapement gibt den Winkel der Schreibrichtung in 1/10 Grad an, um
die die Textausgabe gegenüber der X-Achse gedreht wird. Diese Angabe ist nur bei
TrueType- oder OpenType-Font gültig. Bei allen anderen Zeichensätzen wird dieser
Parameter ignoriert.

lfOrientation bestimmt die Drehung der einzelnen Buchstaben. Unter WINDOWS95/98
ist dieser Eintrag nicht relevant. Aus Gründen der Portabilität von Programmen zwischen
WINDOWS95/98 und WINDOWS NT/2000 sollte dieses Element aber auf den gleichen Wert
wie lfEscapement gesetzt werden.
Das nächste Element lfWeight bestimmt die Schriftdicke. Zulässig sind
hier Werte zwischen 0 (dünne Schrift) und 1000 (dicke Schrift). Für die Schriftdicke
sind verschiedene Konstanten vordefiniert. Welche Konstanten es gibt und wie sie
sich auswirken entnehmen Sie bitte dem nachfolgenden Bild.

 |
Nicht alle Zeichensätze unterstützen alle verfügbaren Schriftdicken.
Der im obigen Bild verwendete Zeichensatz Times New Roman unterstützt nur die
Schriftdicken FW_NORMAL, FW_BOLD und FW_HEAVY. Welcher Zeichensatz welche Schriftdicken
unterstützt ist leider nur durch testen herauszufinden |
Die nächsten drei Elemente lfItalic, lfUnderline und lfStrikeOut
spezifizieren, ob der Text kursiv, unterstrichen und/oder durchgestrichen ausgegeben
werden soll. Setzen Sie das Element auf TRUE, dessen Schriftstile Sie verwenden
wollen.
Als nächstes folgt ein wichtiges Element der Struktur, das Element lfCharSet.
Durch dieses Element wird festgelegt, für welche 'Sprache' der Zeichensatz eingestellt
werden soll. Diese Einstellung betrifft die sprachspezifischen Zeichen wie z.B.
im Deutschen die Umlaute. Für dieses Element sind ungefähr 19 verschiedene Konstanten
definiert. In der Regel werden Sie hier die Konstante ANSI_CHARSET einsetzen. Das
nachfolgende Bild veranschaulicht an Hand der Schrift Arial einige CharSets:

 |
Weiter unten in dieser Lektion lernen Sie noch ein Programm
kennen, das alle auf dem Rechner installierten Schriftarten und den dazugehörigen
CharSet ausgibt. Sie können dieses Programm immer dann einsetzen, wenn Sie sich
nicht sicher über den einzustellenden CharSet sind. |
lfOutPrecision spezifiziert wie genau der Font-Mapper die gewünschte
Zeichenhöhe, Zeichenbreite usw. beachten muss. Auch hier sind wieder eine Unzahl
von Konstanten definiert die Sie der Online-Hilfe unter dem Stichwort LOGFONT
entnehmen können. Standardmäßig können Sie für dieses Element die Konstante OUT_DEFAULT_PRECIS
einsetzen.
Auch das nächste Element lfClipPrecision wir vom Font-Mapper benötigt
um feststellen zu können, wie Zeichen abzuschneiden sind die außerhalb des Clipping-Bereichs
liegen. Und auch für dieses Element sind wieder mehrere Konstanten definiert die
Sie ebenfalls bei Bedarf der Online-Hilfe entnehmen. Wenn Ihre Anwendung an das
Clipping keine besonderen Anforderungen stellt, geben Sie hier die Konstante CLIP_DEFAULT_PRECIS
an.
 |
Sie erinnern sich doch hoffentlich noch daran, dass innerhalb
eines Fensters nur in dem Bereich Ausgaben erfolgen, der als ungültig markiert
wurde. |
lfQuality bestimmt wie genau der Font-Mapper die gewünschten Zeichensatz-Attribute
beachten muss. In der Regel geben Sie hier den Wert DEFAULT_QUALITY vor. Wenn Sie
DRAFT_QUALITY einstellen wird beim Anpassen des Zeichensatzes eine mittlere Qualität
verwendet wobei Schriftgrößen, die nicht im Original-Zeichensatz vorhanden sind,
durch den Font-Mapper erzeugt werden. Die höchste Qualität erreichen Sie durch Angabe
der Konstanten PROOF_QUALITY. Hierbei wird die Schrift aber nur in der Größe ausgegeben,
die der gewünschten Größe am nächsten kommt, d.h. es findet keine Größenanpassung
des Original-Zeichensatzes durch den Font-Mapper statt.
lfPitchAndFamily spezifiziert den Schrifttyp und die Zeichensatz-Familie
des gewünschten Zeichensatzes. Für die Zeichensatz-Familie sind Konstanten in der
Form FF_xxx definiert. Diese Konstanten wurden bereits am Anfang der Lektion bei
der Behandlung Kenndaten einer Schrift aufgeführt. Für den Schrifttyp stehen die
Konstanten DEFAULT_PITCH, FIXED_PITCH oder VARIABLE_PITCH zur Verfügung. Je nach
dem, ob eine Proportionalschrift verwendet werden soll oder nicht, ist die entsprechende
Konstante mit der Konstante für die Zeichensatz-Familie (FF_xxx) zu verodern,
Ganz am Schluss der Struktur steht das wichtigste Element lfFaceName.
Dieses Element bestimmt die eigentliche Schrift wie z.B. Arial oder Times New Roman.
Der Schriftname darf nicht mehr als 32 Zeichen, einschl. der abschließenden Null,
lang sein.
 |
Sehr wichtig: Beachten Sie bitte, dass der hier angegebene Schriftname immer
mit dem unter lfCharSet angegebenen CharSet übereinstimmt. Wollen Sie
z.B. die Schrift 'Symbol' verwenden, so muss lfCharSet unbedingt den
Wert SYMBOL_CHARSET enthalten. Ansonsten erhalten Sie keine entsprechende Ausgabe! |
Nachdem Sie nun die Kenndaten eines Zeichensatz kennen, kann es an die 'Erstellung'
des gewünschten Zeichensatzes gehen. Dazu definieren Sie sich zuerst ein entsprechendes
MFC-Objekt CFont für den Zeichensatz. Der Konstruktor erstellt jedoch nur
ein MFC-Objekt, das aber noch nicht mit einem bestimmten Zeichensatz verbunden ist.
Um das CFont-Objekt mit einem Zeichensatz zu verbinden gibt es mehrere
Möglichkeiten. Die einfachste hierbei ist der Aufruf der CFont-Methode
CreatePointFont(...). Diese Methode erhält als Parameter die Schriftgröße
in 1/10 point und den Namen des Zeichensatzes, z.B. Arial. Zusätzlich kann an die
Methode noch ein Zeiger auf den DC übergeben werden, der für die Umrechnung der
point Einheiten in logische Einheiten verwendet wird. Wenn Sie hier den Defaultwert
NULL übernehmen, wird für die Umrechnung der Screen-DC verwendet. Denken Sie immer
daran, dass der eingestellte Mapping-Mode für die Darstellung des Zeichensatzes
eine Rolle spielt. Nach dem der Zeichensatz erstellt wurde, müssen Sie diesen noch
mittels der CDC Methode SelectObject(...) auswählen. Alle danach
folgenden Textausgaben (siehe vorherige Lektion) erfolgen dann mit dem ausgewählten
Zeichensatz. Vergessen Sie aber nicht vorher den Hintergrund-Modus, die Schriftfarbe
und eventuell die Hintergrundfarbe ebenfalls einzustellen.
 |
Versuchen Sie nun die Ausgabe des vorherigen Beispiels mit
dem Zeichensatz Arial in der Größe 12pt vorzunehmen.
 |
Wenn Sie genug geschwitzt haben kann ich Ihnen auch meine Lösung anzeigen. |
Lösung zur Ausgabe in Arial 12pt
void CFontsView::OnDraw(CDC*
pDC)
{
CFontsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten
hinzufügen
// Zeichenfarbe auf blau setzen
pDC->SetTextColor(RGB(0,0,255));
// Hintergrund auf hellgrau setzen
pDC->SetBkColor(RGB(0xc0,0xc0,0xc0));
pDC->SetBkMode(OPAQUE);
// Arial Zeichensatz
in der Groesse 12pt erstellen
CFont
CMyFont;
CMyFont.CreatePointFont(120,"Arial");
// Und neuen Zeichensatz
selektieren
pDC->SelectObject(&CMyFont);
// Y-Postion der Ausgabe
int nYPos = 10;
// Zuerst Hoehe des akt. Zeichensatzes auslesen
TEXTMETRIC strFontData;
pDC->GetTextMetrics(&strFontData);
// 1. Zeile ausgeben
pDC->TextOut(10,nYPos,"Emil Maier",10);
// Y-Position der nächsten Zeile berechnen
nYPos += strFontData.tmHeight;
// 2. Zeile ausgeben
pDC->TextOut(10,nYPos,"Kurze Gasse 10",14);
// Y-Position der nächsten Zeile berechnen
nYPos += strFontData.tmHeight;
// 3. Zeile ausgeben
pDC->TextOut(10,nYPos,"12345 AStadt",12);
// Y-Position der nächsten Zeile berechnen
nYPos += strFontData.tmHeight;
// 4. Zeile ausgeben
pDC->TextOut(10,nYPos,"Deutschland",11);
} |
Das war wirklich nicht schwierig, oder?
Ende der Lösung
|
|
Die Methode CreatePointFont(...) besitzt jedoch gewissen Einschränkungen
was den darstellbaren Zeichensatz betrifft. So können Sie z.B. die Schriftdicke
oder den Schriftstil hierbei nicht einstellen. Uneingeschränkten Zugriff auf alle
verfügbaren Zeichensatz-Attribute bietet die CFont-Methode CreateFontIndirect(...).
Sie erhält als Parameter einen Zeiger auf eine entsprechend ausgefüllte LOGFONT
Struktur. Wie die LOGFONT Struktur im Prinzip auszufüllen ist haben Sie
weiter oben schon erfahren. Nur noch ein Hinweis dazu: damit Sie nicht alle Elemente
der Struktur explizit ausfüllen müssen, können Sie die gesamte Struktur vor dem
Ausfüllen mit '0' initialisieren. Dies bewirkt, dass alle nicht explizit angegebenen
Elemente mit ihren Defaultwerten vorbelegt werden.
 |
Versuchen Sie nun die Ausgabe des vorherigen Beispiels mit
dem Symbol-Zeichensatz WingsDings in der Größe 24pt und in Fettschrift
vorzunehmen.
 |
Wenn Sie genug geschwitzt haben kann ich Ihnen auch meine Lösung anzeigen. |
Lösung zur Ausgabe mit Symbol-Zeichensatz
void CFontsView::OnDraw(CDC*
pDC)
{
CFontsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten
hinzufügen
// Zeichenfarbe auf blau setzen
pDC->SetTextColor(RGB(0,0,255));
// Hintergrund auf hellgrau setzen
pDC->SetBkColor(RGB(0xc0,0xc0,0xc0));
pDC->SetBkMode(OPAQUE);
// CFont-Objekt
und LOGFONT Struktur anlegen
CFont
CMyFont;
LOGFONT strMyFont;
// LOGFONT-Struktur
zuerst mit Default vorbelegen
memset(&strMyFont,0,sizeof(strMyFont));
// Nun die notwendigen
Fontparameter eintragen
strMyFont.lfHeight =
24;
strMyFont.lfWeight = FW_BOLD;
strMyFont.lfCharSet = SYMBOL_CHARSET;
strcpy(strMyFont.lfFaceName,"Wingdings");
// Jetzt Zeichensatz
erstellen und selektieren
CMyFont.CreateFontIndirect(&strMyFont);
pDC->SelectObject(&CMyFont);
// Y-Postion der Ausgabe
....
} |
Im Prinzip ist's nicht schwierig, wenn man erst einmal den richtigen
Char-Set gefunden hat. Beachten Sie, dass hier die Größenangabe der Schrift
direkt in point erfolgt und nicht mehr in 1/10 point wie beim Aufruf der
Methode CreatePointFont(...).
Ende der Lösung
|
Übersetzen und starten Sie das Programm. Sie werden zwar eine etwas merkwürdige
Ausgabe erhalten aber Sie sollen ja ruhig wieder etwas mit den Zeichensätzen
spielen.
Das fertige Beispiel finden Sie auch unter 05GDI\Fonts.
|
 |
Zum Abschluss dieser Lektion noch drei Hinweise:
- Es gibt noch zwei weitere Methoden zur Erstellung eines Zeichensatzes:
CreateFont(...) und CreatePointFontIndirect(...). Diese
unterscheiden sich aber nur in der Art der Parameterübergabe von den aufgeführten
Methoden.
- Als Ergänzung zu dieser Lektion wurde noch das Programm
05GDI\EnumFonts aufgenommen. Es zeigt
an Hand einer weiteren WINDOWS API Funktion EnumFontFamiliesEx(...)
wie Sie alle im System installierten Zeichensätze auslesen können. Das
Programm gibt den Font-Namen (lfFaceName Element der LOGFONT-Struktur)
sowie den dazugehörigen CharSet (lfCharSet Element in LOGFONT)
aus.
- Sie können Sie das Aussehen der auf Ihrem Rechner installierten Zeichensätze
ansehen, indem Sie im Verzeichnis WINDOWS\FONTS einen Doppelklick auf einen
Zeichensatz durchführen.
|
Mit dem Ende dieser Lektion verlassen wir das Zeichnen von Grafiken und Texten
und wenden uns in der nächsten Lektion der Darstellung von Bitmap-Dateien zu.
|