Aufzählen der installierten Schriftarten
In einigen Fällen muss eine Anwendung in der Lage sein, die verfügbaren Schriftarten aufzuzählen und die Schriftart auszuwählen, die für einen bestimmten Vorgang am besten geeignet ist. Eine Anwendung kann die verfügbaren Schriftarten aufzählen, indem sie die Funktion EnumFonts oder EnumFontFamilies aufruft. Diese Funktionen senden Informationen zu den verfügbaren Schriftarten an eine Rückruffunktion, die von der Anwendung bereitgestellt wird. Die Rückruffunktion empfängt Informationen in LOGFONT- und NEWTEXTMETRIC-Strukturen. (Die NEWTEXTMETRIC-Struktur enthält Informationen zu einer TrueType-Schriftart. Wenn die Rückruffunktion Informationen zu einer Nicht-TrueType-Schriftart empfängt, sind die Informationen in einer TEXTMETRIC-Struktur enthalten.) Mithilfe dieser Informationen kann eine Anwendung die Auswahlmöglichkeiten des Benutzers auf die verfügbaren Schriftarten beschränken.
Die EnumFontFamilies-Funktion ähnelt der EnumFonts-Funktion, enthält jedoch einige zusätzliche Funktionen. EnumFontFamilies ermöglicht einer Anwendung die Nutzung von Formatvorlagen, die mit TrueType-Schriftarten verfügbar sind. Neue und aktualisierte Anwendungen sollten EnumFontFamilies anstelle von EnumFonts verwenden.
TrueType-Schriftarten sind nach einem Schriftartnamen (z. B. Courier New) und Formatnamen (z. B. kursiv, fett und extra fett) organisiert. Die EnumFontFamilies-Funktion listet alle Stile auf, die einem angegebenen Familiennamen zugeordnet sind, nicht nur die fetten und kursiven Attribute. Wenn das System beispielsweise eine TrueType-Schriftart namens Courier New Extra-Bold enthält, listet EnumFontFamilies sie mit den anderen Courier New-Schriftarten auf. Die Funktionen von EnumFontFamilies sind hilfreich für Schriftarten mit vielen oder ungewöhnlichen Stilen und für Schriftarten, die internationale Grenzen überschreiten.
Wenn eine Anwendung keinen Schriftartnamen enthält, stellen die Funktionen EnumFonts und EnumFontFamilies Informationen zu einer Schriftart in jeder verfügbaren Familie bereit. Um alle Schriftarten in einem Gerätekontext aufzulisten, kann die Anwendung NULL für den Schriftartnamen angeben, eine Liste der verfügbaren Schriftarten kompilieren und dann jede Schriftart in jeder Schriftart auflisten.
Im folgenden Beispiel wird die EnumFontFamilies-Funktion verwendet, um die Anzahl der verfügbaren Raster-, Vektor- und TrueType-Schriftfamilien abzurufen.
UINT uAlignPrev;
int aFontCount[] = { 0, 0, 0 };
char szCount[8];
HRESULT hr;
size_t * pcch;
EnumFontFamilies(hdc, (LPCTSTR) NULL,
(FONTENUMPROC) EnumFamCallBack, (LPARAM) aFontCount);
uAlignPrev = SetTextAlign(hdc, TA_UPDATECP);
MoveToEx(hdc, 10, 50, (LPPOINT)NULL);
TextOut(hdc, 0, 0, "Number of raster fonts: ", 24);
itoa(aFontCount[0], szCount, 10);
hr = StringCchLength(szCount, 9, pcch);
if (FAILED(hr))
{
// TODO: write error handler
}
TextOut(hdc, 0, 0, szCount, *pcch);
MoveToEx(hdc, 10, 75, (LPPOINT)NULL);
TextOut(hdc, 0, 0, "Number of vector fonts: ", 24);
itoa(aFontCount[1], szCount, 10);
hr = StringCchLength(szCount, 9, pcch);
if (FAILED(hr))
{
// TODO: write error handler
}
TextOut(hdc, 0, 0, szCount, *pcch);
MoveToEx(hdc, 10, 100, (LPPOINT)NULL);
TextOut(hdc, 0, 0, "Number of TrueType fonts: ", 26);
itoa(aFontCount[2], szCount, 10);
hr = StringCchLength(szCount, 9, pcch);
if (FAILED(hr))
{
// TODO: write error handler
}
TextOut(hdc, 0, 0, szCount, *pcch);
SetTextAlign(hdc, uAlignPrev);
BOOL CALLBACK EnumFamCallBack(LPLOGFONT lplf, LPNEWTEXTMETRIC lpntm, DWORD FontType, LPVOID aFontCount)
{
int far * aiFontCount = (int far *) aFontCount;
// Record the number of raster, TrueType, and vector
// fonts in the font-count array.
if (FontType & RASTER_FONTTYPE)
aiFontCount[0]++;
else if (FontType & TRUETYPE_FONTTYPE)
aiFontCount[2]++;
else
aiFontCount[1]++;
if (aiFontCount[0] || aiFontCount[1] || aiFontCount[2])
return TRUE;
else
return FALSE;
UNREFERENCED_PARAMETER( lplf );
UNREFERENCED_PARAMETER( lpntm );
}
In diesem Beispiel werden zwei Masken verwendet: RASTER _ FONTTYPE und TRUETYPE _ FONTTYPE, um den Typ der aufzuzähligen Schriftart zu bestimmen. Wenn das RASTER _ FONTTYPE-Bit festgelegt ist, ist die Schriftart eine Rasterschriftart. Wenn das TRUETYPE _ FONTTYPE-Bit festgelegt ist, ist die Schriftart eine TrueType-Schriftart. Wenn kein Bit festgelegt ist, ist die Schriftart eine Vektorschriftart. Eine dritte Maske, DEVICE _ FONTTYPE, wird festgelegt, wenn ein Gerät (z. B. ein Drucker) das Herunterladen von TrueType-Schriftarten unterstützt. Sie ist 0 (null), wenn es sich bei dem Gerät um einen Anzeigeadapter, einen Punktmatrixdrucker oder ein anderes Rastergerät handelt. Eine Anwendung kann auch die DEVICE _ FONTTYPE-Maske verwenden, um von GDI bereitgestellte Rasterschriftarten von vom Gerät bereitgestellten Schriftarten zu unterscheiden. Das System kann Fett-, Kursiv-, Unterstreichungs- und Durchstausattribute für von GDI bereitgestellte Rasterschriftarten simulieren, jedoch nicht für vom Gerät bereitgestellte Schriftarten.
Eine Anwendung kann auch die Bits 1 und 2 im tmPitchAndFamily-Member der NEWTEXTMETRIC-Struktur überprüfen, um eine TrueType-Schriftart zu identifizieren. Wenn Bit 1 0 und Bit 2 1 ist, ist die Schriftart eine TrueType-Schriftart.
Vektorschriftarten werden als OEM _ CHARSET anstelle von ANSI _ CHARSET kategorisiert. Einige Anwendungen identifizieren Vektorschriftarten anhand dieser Informationen und überprüfen den tmCharSet-Member der NEWTEXTMETRIC-Struktur. Diese Kategorisierung verhindert in der Regel, dass die Schriftartzuordnung Vektorschriftarten auswählt, es sei denn, sie werden ausdrücklich angefordert. (Die meisten Anwendungen verwenden keine Vektorschriftarten mehr, da ihre Striche einzelne Linien sind und das Zeichnen länger dauert als TrueType-Schriftarten, die viele der gleichen Skalierungs- und Drehungsfunktionen bieten, die Vektorschriftarten erforderten.)