インストールされているフォントの列挙
場合によっては、アプリケーションで使用可能なフォントを列挙し、特定の操作に最も適したフォントを選択できる必要があります。 アプリケーションは、 EnumFonts または EnumFontFamilies 関数を呼び出すことによって、使用可能なフォントを列挙できます。 これらの関数は、使用可能なフォントに関する情報を、アプリケーションが提供するコールバック関数に送信します。 コールバック関数は、 LOGFONT 構造体と NEWTEXTMETRIC 構造体の情報を受け取ります。 ( NEWTEXTMETRIC 構造体には、TrueType フォントに関する情報が含まれています。コールバック関数が TrueType 以外のフォントに関する情報を受け取ると、その情報は TEXTMETRIC 構造体に含まれます)。この情報を使用することで、アプリケーションは、使用可能なフォントのみにユーザーの選択を制限できます。
EnumFontFamilies 関数は EnumFonts 関数に似ていますが、いくつかの追加機能が含まれています。 EnumFontFamilies を使用すると、アプリケーションは TrueType フォントで使用できるスタイルを利用できます。 新しいアプリケーションとアップグレードされたアプリケーションでは、EnumFonts の代わりに EnumFontFamilies を使用する必要があります。
TrueType フォントは、書体名 (Courier New など) とスタイル名 (斜体、太字、太字など) を中心に整理されます。 EnumFontFamilies 関数は、太字や斜体の属性だけでなく、指定したファミリ名に関連付けられているすべてのスタイルを列挙します。 たとえば、システムに Courier New Extra-Bold という TrueType フォントが含まれている場合、 EnumFontFamilies は他の Courier New フォントと共にそれを一覧表示します。 EnumFontFamilies の機能は、多くのスタイルまたは通常とは異なるスタイルのフォントや、国境を越えるフォントに役立ちます。
アプリケーションが書体名を指定しない場合、 EnumFonts 関数と EnumFontFamilies 関数は、使用可能な各ファミリ内の 1 つのフォントに関する情報を提供します。 デバイス コンテキスト内のすべてのフォントを列挙するには、アプリケーションで書体名に NULL を 指定し、使用可能な書体の一覧をコンパイルしてから、各書体の各フォントを列挙します。
次の例では、 EnumFontFamilies 関数を使用して、使用可能なラスター、ベクター、および TrueType フォント ファミリの数を取得します。
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 );
}
この例では、RASTER_FONTTYPE と TRUETYPE_FONTTYPE の 2 つのマスクを使用して、列挙するフォントの種類を決定します。 RASTER_FONTTYPE ビットが設定されている場合、フォントはラスター フォントです。 TRUETYPE_FONTTYPE ビットが設定されている場合、フォントは TrueType フォントです。 どちらのビットも設定されていない場合、フォントはベクター フォントになります。 3 つ目のマスクDEVICE_FONTTYPEは、デバイス (レーザー プリンターなど) が TrueType フォントのダウンロードをサポートしている場合に設定されます。デバイスがディスプレイ アダプター、ドット マトリックス プリンター、またはその他のラスター デバイスの場合は 0 です。 アプリケーションでは、DEVICE_FONTTYPE マスクを使用して、GDI 提供のラスター フォントとデバイス提供のフォントを区別することもできます。 システムは、GDI 提供のラスター フォントの太字、斜体、下線、および取り消し線の属性をシミュレートできますが、デバイス指定のフォントではシミュレートできません。
アプリケーションでは、NEWTEXTMETRIC 構造体の tmPitchAndFamily メンバーでビット 1 と 2 をチェックして、TrueType フォントを識別することもできます。 ビット 1 が 0 で、ビット 2 が 1 の場合、フォントは TrueType フォントになります。
ベクター フォントは、ANSI_CHARSETではなくOEM_CHARSETとして分類されます。 一部のアプリケーションでは、この情報を使用してベクター フォントを識別し、NEWTEXTMETRIC 構造体の tmCharSet メンバーを確認します。 通常、この分類では、特に要求されない限り、フォント マッパーがベクター フォントを選択できなくなります。 (ほとんどのアプリケーションではベクター フォントが使用されなくなりました。ストロークは 1 行であり、TrueType フォントよりも描画に時間がかかり、ベクター フォントを必要とするのと同じスケーリングと回転機能の多くが提供されます)。