설치된 글꼴 열거

경우에 따라 애플리케이션에서 사용 가능한 글꼴을 열거하고 특정 작업에 가장 적합한 글꼴을 선택할 수 있어야 합니다. 애플리케이션은 EnumFonts 또는 EnumFontFamilies 함수를 호출하여 사용 가능한 글꼴을 열거할 수 있습니다. 이러한 함수는 사용 가능한 글꼴에 대한 정보를 애플리케이션이 제공하는 콜백 함수로 보냅니다. 콜백 함수는 LOGFONTNEWTEXTMETRIC 구조에서 정보를 받습니다. NEWTEXTMETRIC 구조체에는 TrueType 글꼴에 대한 정보가 포함되어 있습니다. 콜백 함수가 TrueType이 아닌 글꼴에 대한 정보를 받으면 정보가 TEXTMETRIC 구조에 포함됩니다.) 이 정보를 사용하면 애플리케이션에서 사용자의 선택 항목을 사용 가능한 글꼴로만 제한할 수 있습니다.

EnumFontFamilies 함수는 EnumFonts 함수와 비슷하지만 몇 가지 추가 기능을 포함합니다. EnumFontFamilies 를 사용하면 애플리케이션이 TrueType 글꼴에서 사용할 수 있는 스타일을 활용할 수 있습니다. 새 애플리케이션과 업그레이드된 애플리케이션은 EnumFonts 대신 EnumFontFamilies를 사용해야 합니다.

TrueType 글꼴은 서체 이름(예: Courier New) 및 스타일 이름(예: 기울임꼴, 굵게 및 추가 굵게)을 중심으로 구성됩니다. EnumFontFamilies 함수는 단순히 굵게 및 기울임꼴 특성이 아니라 지정된 패밀리 이름과 연결된 모든 스타일을 열거합니다. 예를 들어 시스템에 Courier New Extra-Bold라는 TrueType 글꼴이 포함된 경우 EnumFontFamilies 는 다른 Courier New 글꼴로 나열합니다. EnumFontFamilies의 기능은 스타일이 많거나 특이한 글꼴과 국경을 넘는 글꼴에 유용합니다.

애플리케이션에서 서체 이름을 제공하지 않는 경우 EnumFontsEnumFontFamilies 함수는 사용 가능한 각 패밀리에서 하나의 글꼴에 대한 정보를 제공합니다. 디바이스 컨텍스트의 모든 글꼴을 열거하기 위해 애플리케이션은 서체 이름에 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 글꼴보다 그리는 데 더 오래 걸리기 때문에 더 이상 벡터 글꼴을 사용하지 않습니다. 이는 벡터 글꼴이 필요한 동일한 크기 조정 및 회전 기능을 많이 제공합니다.)