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()
LOGFONT
lF;
m_font.CreateFontIndirect(&lF);
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
|
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