Enumerazione dei tipi di carattere installati
In alcuni casi, un'applicazione deve essere in grado di enumerare i tipi di carattere disponibili e selezionare quella più appropriata per un'operazione specifica. Un'applicazione può enumerare i tipi di carattere disponibili chiamando la funzione EnumFonts o EnumFontFamilies . Queste funzioni inviano informazioni sui tipi di carattere disponibili a una funzione di callback fornita dall'applicazione. La funzione di callback riceve informazioni nelle strutture LOGFONT e NEWTEXTMETRIC . La struttura NEWTEXTMETRIC contiene informazioni su un tipo di carattere TrueType. Quando la funzione di callback riceve informazioni su un tipo di carattere non TrueType, le informazioni sono contenute in una struttura TEXTMETRIC . Usando queste informazioni, un'applicazione può limitare le scelte dell'utente solo ai tipi di carattere disponibili.
La funzione EnumFontFamilies è simile alla funzione EnumFonts , ma include alcune funzionalità aggiuntive. EnumFontFamilies consente a un'applicazione di sfruttare gli stili disponibili con i tipi di carattere TrueType. Le applicazioni nuove e aggiornate devono usare EnumFontFamilies anziché EnumFonts.
I tipi di carattere TrueType sono organizzati intorno a un nome di tipo (ad esempio, Courier New) e ai nomi di stile (ad esempio, corsivo, grassetto e in grassetto). La funzione EnumFontFamilies enumera tutti gli stili associati a un nome di famiglia specificato, non semplicemente gli attributi grassetto e corsivo. Ad esempio, quando il sistema include un tipo di carattere TrueType denominato Courier New Extra-Bold, EnumFontFamilies lo elenca con gli altri tipi di carattere Courier New. Le funzionalità di EnumFontFamilies sono utili per i tipi di carattere con molti stili o insoliti e per i tipi di carattere che attraversano i confini internazionali.
Se un'applicazione non specifica un nome di tipo, le funzioni EnumFonts e EnumFontFamilies forniscono informazioni su un tipo di carattere in ogni famiglia disponibile. Per enumerare tutti i tipi di carattere in un contesto del dispositivo, l'applicazione può specificare NULL per il nome del carattere di tipo, compilare un elenco dei caratteri tipizzabili disponibili e quindi enumerare ogni carattere in ogni carattere di tipo.
Nell'esempio seguente viene usata la funzione EnumFontFamilies per recuperare il numero di famiglie di caratteri raster, vettore e TrueType disponibili.
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 questo esempio vengono usate due maschere, RASTER_FONTTYPE e TRUETYPE_FONTTYPE, per determinare il tipo di carattere da enumerare. Se il bit di RASTER_FONTTYPE è impostato, il tipo di carattere è un carattere raster. Se il bit di TRUETYPE_FONTTYPE è impostato, il tipo di carattere è un carattere TrueType. Se nessuno dei due bit è impostato, il tipo di carattere è un tipo di carattere vettoriale. Una terza maschera, DEVICE_FONTTYPE, viene impostata quando un dispositivo (ad esempio, una stampante laser) supporta il download dei tipi di carattere TrueType; è zero se il dispositivo è una scheda di visualizzazione, una stampante dot-matrix o un altro dispositivo raster. Un'applicazione può anche usare la maschera DEVICE_FONTTYPE per distinguere i tipi di carattere raster forniti da dispositivi da tipi di carattere forniti dal dispositivo. Il sistema può simulare attributi grassetto, corsivo, sottolineatura e strikeout per i tipi di carattere raster forniti da GDI, ma non per i tipi di carattere forniti dal dispositivo.
Un'applicazione può anche controllare bit 1 e 2 nel membro tmPitchAndFamily della struttura NEWTEXTMETRIC per identificare un carattere TrueType. Se bit 1 è 0 e bit 2 è 1, il carattere è un carattere TrueType.
I tipi di carattere vettore vengono classificati come OEM_CHARSET anziché ANSI_CHARSET. Alcune applicazioni identificano i tipi di carattere vettore usando queste informazioni, controllando il membro tmCharSet della struttura NEWTEXTMETRIC . Questa categorizzazione impedisce in genere al mapper di scegliere tipi di carattere vettoriali, a meno che non siano richiesti in modo specifico. La maggior parte delle applicazioni non usa più tipi di carattere vettoriale perché i tratti sono singole righe e richiedono più tempo per disegnare i tipi di carattere TrueType, che offrono molte delle stesse funzionalità di ridimensionamento e rotazione necessarie per i tipi di carattere vettoriale.