설치된 글꼴 열거
경우에 따라 애플리케이션에서 사용 가능한 글꼴을 열거하고 특정 작업에 가장 적합한 글꼴을 선택할 수 있어야 합니다. 애플리케이션은 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 함수는 사용 가능한 각 패밀리에서 하나의 글꼴에 대한 정보를 제공합니다. 디바이스 컨텍스트의 모든 글꼴을 열거하기 위해 애플리케이션은 서체 이름에 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 두 개의 마스크를 사용하여 열거되는 글꼴의 유형을 확인합니다. RASTER_FONTTYPE 비트가 설정된 경우 글꼴은 래스터 글꼴입니다. TRUETYPE_FONTTYPE 비트가 설정된 경우 글꼴은 TrueType 글꼴입니다. 두 비트가 모두 설정되지 않은 경우 글꼴은 벡터 글꼴입니다. 세 번째 마스크인 DEVICE_FONTTYPE 디바이스(예: 레이저 프린터)가 TrueType 글꼴 다운로드를 지원할 때 설정됩니다. 디바이스가 디스플레이 어댑터, 점 매트릭스 프린터 또는 기타 래스터 디바이스인 경우 0입니다. 애플리케이션은 DEVICE_FONTTYPE 마스크를 사용하여 GDI 제공 래스터 글꼴과 디바이스 제공 글꼴을 구분할 수도 있습니다. 시스템은 GDI 제공 래스터 글꼴에 대해 굵게, 기울임꼴, 밑줄 및 취소선 특성을 시뮬레이션할 수 있지만 디바이스에서 제공하는 글꼴에는 시뮬레이션할 수 없습니다.
애플리케이션은 NEWTEXTMETRIC 구조체의 tmPitchAndFamily 멤버에서 비트 1과 2를 검사 TrueType 글꼴을 식별할 수도 있습니다. 비트 1이 0이고 비트 2가 1인 경우 글꼴은 TrueType 글꼴입니다.
벡터 글꼴은 ANSI_CHARSET 대신 OEM_CHARSET 분류됩니다. 일부 애플리케이션은 이 정보를 사용하여 NEWTEXTMETRIC 구조의 tmCharSet 멤버를 확인하여 벡터 글꼴을 식별합니다. 이 분류는 일반적으로 특별히 요청되지 않는 한 글꼴 매퍼가 벡터 글꼴을 선택하지 못하게 합니다. (대부분의 애플리케이션은 스트로크가 한 줄이고 TrueType 글꼴보다 그리는 데 더 오래 걸리기 때문에 더 이상 벡터 글꼴을 사용하지 않습니다. 이는 벡터 글꼴이 필요한 동일한 크기 조정 및 회전 기능을 많이 제공합니다.)