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:

Einige Kenndaten eines Zeichensatzes

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:

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

So soll Ihre Ausgabe ausssehen

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.

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.

Zeichenbreite

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.

Schreibrichtung

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.

Schriftstärke

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:

Die Char-Sets

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.

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.

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:
  1. 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.
  2. 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.
  3. 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.



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