erstellt von: Dr. Erhard Henkes (e.henkes@gmx.net) - C++ und MFC          (Stand: 27.08.2001)

Zurueck zum Inhaltsverzeichnis
zurück zum vorherigen Kapitel
 

Kapitel 13 - Schriften verändern

Viele Einsteiger suchen verzweifelt nach einfachen Möglichkeiten, die es erlauben, die Schriftart z.B. bei Steuerelementen zu programmieren. Leider ist dieses Feature bei der MFC-Programmierung etwas versteckt. Hier soll an einem einfachen Beispiel gezeigt werden, wie man vorgehen kann.

Wir erstellen eine dialogbasierende Anwendung (Vorgehensweise: siehe Kapitel 1) und akzeptieren einfach alle Standards.
Als Name habe ich "Dialog_Schriftarten" gewählt. Nach dem Erstellen findet man nun in der Mitte des Dialogs das Static-Feld namens IDC_STATIC mit dem Titel "ZU ERLEDIGEN: Dialogfeld-Steuerelemente hier plazieren.".

Stellen wir uns nun die Aufgabe, die Schrift dieses Titels zu verändern. Unter "Formate" oder "Erweiterte Formate" findet man nichts passendes. Also müssen wir das im Source-Code lösen:

Zunächst ändern wir den Namen des Feldes ab auf: IDC_STATIC1. Dies müssen wir machen, damit der Klassenassistent dieses Feld unter Objekt-IDs aufführt.

Zusätzlich benötigen wir in unserer Dialog-Klasse z.B. eine Member-Variable m_font vom Typ CFont.

Der richtige Platz für den Source-Code ist die Funktion  OnInitDialog() :
 
//als neue Member-Variable in der Klasse CDialog_SchriftartenDlg:
CFont m_font;

...
...

BOOL CDialog_SchriftartenDlg::OnInitDialog()
{
 ...
 ...
 // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen

 LOGFONT lF;
 lF.lfHeight       = 36;
 lF.lfWidth        = 0;
 lF.lfWeight       = FW_NORMAL;
 lF.lfItalic       = TRUE;
 lF.lfUnderline    = TRUE;
 lF.lfStrikeOut    = TRUE;
 lF.lfEscapement   = 0;
 lF.lfOrientation  = 0;

 m_font.CreateFontIndirect(&lF);
 CWnd* pStatic = GetDlgItem(IDC_STATIC1);
 pStatic->SetFont(&m_font, FALSE);

 return TRUE; 
}

Gehen wir den Code der Reihe nach durch:

Man erzeugt eine Struktur vom Typ LOGFONT. Diese Struktur beschreibt einen logischen Font.
Man verändert diesen Font durch Einstellen seiner Attribute, wie oben erfolgt.

Mittels der Member-Funktion
BOOL CreateFontIndirect( const LOGFONT* lpLogFont )
ordnen wir unserem CFont-Objekt m_font die Eigenschaften der LOGFONT-Struktur zu.

Die Zeile
CWnd* pStatic = GetDlgItem(IDC_STATIC1);
habe ich nur eingebaut, damit wir auch ohne Member-Variable für IDC_STATIC1 auskommen.

Im letzten Schritt setzen wir die Funktion
void CWnd::SetFont( CFont* pFont, BOOL bRedraw = TRUE )
ein, um unserem Fenster, hier das Static-Feld IDC_STATIC1, den gewünschten Font zu verpassen.
Hierbei wird dem "logischen" Font vom Betriebssystem nun ein möglichst ähnlicher "existierender" Font zugeordnet.

Zuletzt müssen wir noch die Größe des Feldes im Ressourcen-Editor an den gewählten Font anpassen.

Wenn Sie das nachvollzogen haben, sollten Sie folgendes Ergebnis erhalten:


 

Als Fazit kann man sich folgende Vorgehensweise einprägen:
 
CFont  //(Member-Variable)

LOGFONT 
CFont::CreateFontIndirect(LOGFONT*) 
CWnd::SetFont(CFont*,...)

Ist doch vom Prinzip her nicht allzu schwer, oder? Nun muß man sich nur noch mit dem Thema Font und der Struktur LOGFONT beschäftigen, damit man zum geübten Font-Stylist werden kann.

Also beginnen wir mit der Struktur LOGFONT:
 
 Die 14 Elemente der Struktur LOGFONT: Bedeutung
 LONG  lfHeight      Zeichenhöhe incl. internem Durchschuß (log. Einheiten) (bei 0 wählt das Betriebssystem)
 LONG  lfWidth  Zeichenbreite (log. Einheiten) (bei 0 wählt das Betriebssystem)
 LONG  lfEscapement  Schreibrichtung in 1/10 Grad gegen Uhrzeigersinn (Win98: Schreibrichtung und Orientierung)
 LONG  lfOrientation  Orientierung einzelner Zeichen bezüglich Schreibrichtung 1/10 Grad gegen Uhrzeigersinn
 LONG  lfWeight  Normalschrift / Fettschrift (z.Z. unterscheidbar: 0 - 400 / 700)
 BYTE  lfItalic  Normal / Kursiv
 BYTE  lfUnderline  Normal / Unterstrichen
 BYTE  lfStrikeOut  Normal / Durchgestrichen
 BYTE  lfCharSet  Zeichensatz (Zusammenhang zwischen Code und Zeichen)
 BYTE  lfOutPrecision  Ausgabe-Präzision (empfohlen: OUT_TT_ONLY_PRECIS)
 BYTE  lfClipPrecision  Clipping-Präzision (empfohlen: CLIP_DEFAULT_PRECIS)
 BYTE  lfQuality  Ausgabe-Qualität bei Bitmap-Schriften (Schönschrift: PROOF_QUALITY)
 BYTE  lfPitchAndFamily  Pitch (proportional/nicht proportional) / Schriftfamilie 
 TCHAR lfFaceName[LF_FACESIZE]  Schriftname (z.B. Courier, Arial, ...) LF_FACESIZE = 32 

Weitere Details findet man z.B. in MSDN.
Experimentieren Sie munter weiter mit der LOGFONT-Struktur.
Hier noch eine Anregung unter Einsatz des Attributes lfCharSet:

  LOGFONT lF;
  lF.lfHeight       = 30;
  lF.lfWidth        = 0;
  lF.lfWeight       = FW_NORMAL; // entspricht 400
  lF.lfItalic       = TRUE;
  lF.lfUnderline    = TRUE;
  lF.lfStrikeOut    = FALSE;
  lF.lfEscapement   = 0;
  lF.lfOrientation  = 0;
  lF.lfCharSet      = CHINESEBIG5_CHARSET;

Vordefinierte lfCharSet:
ANSI_CHARSET, BALTIC_CHARSET, CHINESEBIG5_CHARSET, DEFAULT_CHARSET, EASTEUROPE_CHARSET, GB2312_CHARSET, GREEK_CHARSET, HANGUL_CHARSET, MAC_CHARSET, OEM_CHARSET, RUSSIAN_CHARSET, SHIFTJIS_CHARSET, SYMBOL_CHARSET, TURKISH_CHARSET
 
 
 

weiter zum Nächsten Kapitel

Zurueck zum Inhaltsverzeichnis