다음을 통해 공유


사용자 지정 글꼴 설정

이 항목에서는 앱에서 사용자 지정 글꼴을 사용할 수 있는 다양한 방법을 설명합니다.

소개

대부분의 경우 앱은 시스템에 로컬로 설치된 글꼴을 사용합니다. DirectWrite IDWriteFactory3::GetSystemFontSet 또는 IDWriteFactory::GetSystemFontCollection 메서드를 사용하여 이러한 글꼴에 대한 액세스를 제공합니다. 경우에 따라 앱은 Windows 10 일부로 포함되어 있지만 현재 시스템에 설치되지 않은 글꼴을 사용할 수도 있습니다. 이러한 글꼴은 GetSystemFontSet 메서드를 사용하거나 includeDownloadableFonts가 TRUE로 설정된 IDWriteFactory3::GetSystemFontCollection 을 호출하여 Windows 글꼴 서비스에서 액세스할 수 있습니다. 

그러나 일부 애플리케이션 시나리오에서는 앱이 시스템에 설치되지 않고 Windows 글꼴 서비스에서 제공하지 않는 글꼴을 사용해야 합니다. 이러한 시나리오의 예는 다음과 같습니다.

  • 글꼴은 앱 이진 파일 내에 리소스로 포함됩니다.
  • 글꼴 파일은 앱 패키지 내에 번들로 묶이고 앱의 설치 폴더 아래 디스크에 저장됩니다.
  • 앱은 사용자가 지정한 글꼴 파일을 로드해야 하는 글꼴 개발 도구입니다. 
  • 글꼴은 앱에서 보거나 편집할 수 있는 문서 파일에 포함됩니다. 
  • 앱은 공용 웹 글꼴 서비스에서 가져온 글꼴을 사용합니다. 
  • 앱은 프라이빗 네트워크 프로토콜을 통해 스트리밍된 글꼴 데이터를 사용합니다. 

DirectWrite 이러한 시나리오 및 기타 유사한 시나리오에서 사용자 지정 글꼴을 사용하기 위한 API를 제공합니다. 사용자 지정 글꼴 데이터는 로컬 파일 시스템의 파일에서 올 수 있습니다. HTTP를 사용하여 액세스하는 원격 클라우드 기반 원본에서 또는 메모리 버퍼에 로드된 후 임의의 원본에서 

참고

DirectWrite Windows 7 이후 사용자 지정 글꼴을 사용하기 위한 API를 제공해 왔지만, Windows 10 최신 API가 추가되었으며, Windows 10 크리에이터스 업데이트(미리 보기 빌드 15021 이상)에도 추가되어 언급된 여러 시나리오를 보다 쉽게 구현할 수 있습니다. 이 항목에서는 창 10에서 사용할 수 있는 API에 중점을 둡니다. 이전 Windows 버전에서 작업해야 하는 애플리케이션은 사용자 지정 글꼴 컬렉션(Windows 7/8)을 참조하세요. 

 

API의 요약

이 항목에서는 다음 API에서 제공하는 기능에 중점을 둡니다.

 

주요 개념

사용자 지정 글꼴을 사용하기 위한 DirectWrite API를 이해하려면 이러한 API의 기반이 되는 개념적 모델을 이해하는 것이 도움이 될 수 있습니다. 주요 개념은 여기에서 설명합니다. 

DirectWrite 실제 텍스트 레이아웃 또는 렌더링을 수행하는 경우 실제 글꼴 데이터에 액세스해야 합니다. 글꼴 얼굴 개체는 로컬 시스템에 있어야 하는 실제 글꼴 데이터를 보유합니다. 그러나 특정 글꼴의 가용성 확인 또는 사용자에게 글꼴 선택 항목 표시와 같은 다른 작업의 경우 필요한 것은 실제 글꼴 데이터 자체가 아닌 특정 글꼴에 대한 참조뿐입니다. DirectWrite 글꼴 얼굴 참조 개체는 글꼴을 찾아 인스턴스화하는 데 필요한 정보만 보유합니다. 글꼴 얼굴 참조는 실제 데이터를 보유하지 않으므로 DirectWrite 실제 데이터가 원격 네트워크 위치에 있는 글꼴 얼굴 참조와 실제 데이터가 로컬인 경우를 처리할 수 있습니다.

글꼴 집합은 글꼴을 참조하거나 패밀리 이름 또는 글꼴 두께 값과 같은 다른 글꼴과 비교할 때 사용할 수 있는 특정 기본 정보 속성과 함께 글꼴 얼굴 참조 집합입니다. 다양한 글꼴의 실제 데이터는 로컬이거나 모두 원격이거나 일부 혼합일 수 있습니다.

글꼴 집합을 사용하여 해당 글꼴 컬렉션 개체를 가져올 수 있습니다. 자세한 내용은 아래 글꼴 집합 및 글꼴 컬렉션을 참조하세요. 

IDWriteFontSet 인터페이스는 패밀리 이름 또는 글꼴 두께와 같은 속성 값 또는 특정 속성 값과 일치하는 글꼴 얼굴 참조를 쿼리할 수 있는 메서드를 제공합니다. 특정 선택 영역으로 필터링한 후 레이아웃 및 렌더링에 사용할 수 있는 해당 IDWriteFontFace3 개체를 가져오기 위해 다운로드하는 메서드(실제 글꼴 데이터가 현재 원격인 경우)를 사용하여 IDWriteFontFaceReference 인터페이스의 instance 가져올 수 있습니다. 

IDWriteFontFile 인터페이스는 각 글꼴 얼굴 또는 글꼴 얼굴 참조의 기초가 됩니다. 글꼴 파일의 위치를 나타내며 글꼴 파일 로더와 글꼴 파일 키의 두 가지 구성 요소가 있습니다. 필요한 경우 글꼴 파일 로더(IDWriteFontFileLoader)를 사용하여 파일을 열고 데이터가 있는 스트림을 반환합니다(IDWriteFontFileStream). 로더에 따라 데이터는 로컬 파일 경로, 원격 URL 또는 메모리 버퍼에 있을 수 있습니다. 키는 로더 컨텍스트 내에서 파일을 고유하게 식별하는 로더 정의 값으로, 로더가 데이터를 찾아 스트림을 만들 수 있도록 합니다. 

사용자 지정 글꼴을 사용자 지정 글꼴 집합에 쉽게 추가할 수 있습니다. 그러면 글꼴 선택기 사용자 인터페이스 만들기와 같은 목적으로 글꼴 정보를 필터링하거나 구성하는 데 사용할 수 있습니다. 글꼴 집합을 사용하여 IDWriteTextFormat 및 IDWriteTextLayout과 같은 상위 수준 API에서 사용할 글꼴 컬렉션을 만들 수도 있습니다. IDWriteFontSetBuilder 인터페이스를 사용하여 여러 사용자 지정 글꼴을 포함하는 사용자 지정 글꼴 집합을 만들 수 있습니다. 사용자 지정 글꼴과 시스템 제공 글꼴을 혼합하는 사용자 지정 글꼴 집합을 만드는 데 사용할 수도 있습니다. 또는 글꼴을 실제 데이터의 다른 원본(로컬 스토리지, 원격 URL 및 메모리)과 혼합합니다. 

언급했듯이 글꼴 얼굴 참조는 원격 원본의 글꼴 데이터를 참조할 수 있지만 레이아웃 및 렌더링에 사용할 수 있는 글꼴 얼굴 개체를 얻으려면 데이터가 로컬이어야 합니다. 원격 데이터 다운로드는 글꼴 다운로드 큐에서 처리됩니다. 앱은 IDWriteFontDownloadQueue 인터페이스를 사용하여 원격 글꼴을 다운로드하여 다운로드 프로세스를 시작하고 다운로드 프로세스가 완료되면 작업을 수행할 IDWriteFontDownloadListener 개체를 등록하도록 요청을 큐에 추가할 수 있습니다. 

여기에 설명된 대부분의 인터페이스에서 DirectWrite 시스템 구현을 제공합니다. 한 가지 예외는 원격 글꼴을 로컬로 다운로드할 때 앱이 앱별 작업을 수행하도록 구현하는 IDWriteFontDownloadListener 인터페이스입니다. 앱은 특정한 고급 시나리오에서만 필요하지만 특정 다른 인터페이스에 대해 고유한 사용자 지정 구현을 제공해야 하는 이유가 있을 수 있습니다. 예를 들어 앱은 WOFF2 컨테이너 형식을 사용하는 로컬 스토리지의 글꼴 파일을 처리하기 위해 IDWriteFontFileLoader 인터페이스의 사용자 지정 구현을 제공해야 합니다. 자세한 내용은 아래에 제공됩니다. 

글꼴 및 글꼴 파일 형식

이해하는 데 도움이 되는 또 다른 주요 개념은 개별 글꼴 얼굴과 해당 글꼴을 포함하는 글꼴 파일 간의 관계입니다. 단일 글꼴을 포함하는 OpenType 글꼴 파일(.ttf 또는 .otf)의 개념은 익숙합니다. 그러나 OpenType 글꼴 형식은 여러 글꼴을 포함하는 단일 파일인 OpenType 글꼴 컬렉션(.ttc 또는 .otc)도 허용합니다. OpenType 컬렉션 파일은 밀접하게 관련되어 있고 특정 글꼴 데이터에 대해 동일한 값을 갖는 큰 글꼴에 사용되는 경우가 많습니다. 단일 파일에서 글꼴을 결합하여 공통 데이터를 중복 해제할 수 있습니다. 이러한 이유로 글꼴 얼굴 또는 글꼴 얼굴 참조는 글꼴 파일(또는 이와 동등한 데이터 원본)을 참조해야 할 뿐만 아니라 파일이 컬렉션 파일일 수 있는 일반적인 경우 해당 파일 내에서 글꼴 인덱스도 지정해야 합니다. 

웹에서 사용되는 글꼴의 경우 글꼴 데이터는 종종 특정 컨테이너 형식인 WOFF 또는 WOFF2로 압축되어 글꼴 데이터의 일부 압축과 불법 복제 및 글꼴 라이선스 위반에 대한 어느 정도의 보호를 제공합니다. 기능적으로 WOFF 또는 WOFF2 파일은 OpenType 글꼴 또는 글꼴 컬렉션 파일과 동일하지만 데이터를 사용하기 전에 압축을 풀어야 하는 다른 형식으로 인코딩됩니다. 

특정 DirectWrite API는 개별 글꼴 얼굴을 처리할 수 있지만 다른 API는 여러 얼굴을 포함하는 OpenType 컬렉션 파일을 포함할 수 있는 파일을 처리할 수 있습니다. 마찬가지로 특정 API는 원시 OpenType 형식 데이터만 처리하지만 다른 API는 압축된 WOFF 및 WOFF2 컨테이너 형식을 처리할 수 있습니다. 이러한 세부 정보는 아래 설명에 나와 있습니다. 

글꼴 집합 및 글꼴 컬렉션

일부 애플리케이션은 IDWriteFontCollection 인터페이스를 사용하여 글꼴로 작동하도록 구현될 수 있습니다. 글꼴 컬렉션과 글꼴 집합 간에 직접 대응이 있습니다. 각각 동일한 글꼴을 보유할 수 있지만 다른 organization 표시합니다. 모든 글꼴 컬렉션에서 해당 글꼴 집합을 가져올 수 있으며 그 반대의 경우도 마찬가지입니다.

여러 사용자 지정 글꼴을 사용하는 경우 글꼴 집합 작성기 인터페이스를 사용하여 사용자 지정 글꼴 집합을 만든 다음 글꼴 집합을 만든 후 글꼴 컬렉션을 가져오는 것이 가장 쉽습니다. 사용자 지정 글꼴 집합을 만드는 프로세스는 아래에서 자세히 설명합니다. 글꼴 집합에서 IDWriteFontCollection1 인터페이스를 가져오려면 IDWriteFactory3::CreateFontCollectionFromFontSet 메서드가 사용됩니다.

앱에 컬렉션 개체가 있고 해당 글꼴 집합을 가져와야 하는 경우 IDWriteFontCollection1::GetFontSet 메서드를 사용하여 이 작업을 수행할 수 있습니다. 

일반적인 시나리오

이 섹션에서는 사용자 지정 글꼴 집합과 관련된 가장 일반적인 시나리오 중 일부에 대해 설명합니다.

  • 로컬 파일 시스템의 경로에서 임의의 글꼴을 사용하여 사용자 지정 글꼴 집합을 만듭니다.
  • 로컬 파일 시스템에 저장된 알려진 글꼴(앱과 함께 번들)을 사용하여 사용자 지정 글꼴 집합을 만듭니다.
  • 웹에서 알려진 원격 글꼴을 사용하여 사용자 지정 글꼴 집합 만들기
  • 메모리에 로드된 글꼴 데이터를 사용하여 사용자 지정 글꼴 집합 만들기

이러한 시나리오에 대한 전체 구현은 DirectWrite 사용자 지정 글꼴 집합 샘플에 제공됩니다. 이 샘플에서는 WOFF 또는 WOFF2 컨테이너 형식으로 압축된 글꼴 데이터를 처리하기 위한 한 가지 고급 시나리오를 보여 줍니다. 이 시나리오는 아래에서 설명합니다. 

로컬 파일 시스템에서 임의의 글꼴을 사용하여 글꼴 집합 만들기

로컬 스토리지에서 임의의 글꼴 파일 집합을 처리할 때 IDWriteFontSetBuilder1::AddFontFile 메서드는 단일 호출에서 OpenType 글꼴 컬렉션 파일 내의 모든 글꼴 얼굴과 OpenType 변수 글꼴에 대한 모든 인스턴스를 처리할 수 있으므로 편리합니다. 이 기능은 Windows 10 크리에이터스 업데이트(미리 보기 빌드 15021 이상)에서 사용할 수 있으며, 사용 가능한 경우 언제든지 권장됩니다. 

이 메서드를 사용하려면 다음 프로세스를 사용합니다.

1. IDWriteFactory5 인터페이스를 만들어 시작합니다.
IDWriteFactory5* pDWriteFactory; 
HRESULT hr = DWriteCreateFactory( 
  DWRITE_FACTORY_TYPE_SHARED, 
  __uuidof(IDWriteFactory5), 
  reinterpret_cast<IUnknown**>(&pDWriteFactory) 
); 

 
2. 팩터리를 사용하여 IDWriteFontSetBuilder1 인터페이스를 가져옵니다.

IDWriteFontSetBuilder1* pFontSetBuilder; 
if (SUCCEEDED(hr)) 
{ 
  hr = pDWriteFactory->CreateFontSetBuilder(&pFontSetBuilder); 
}  
                
  1. 로컬 파일 시스템의 각 글꼴 파일에 대해 참조하는 IDWriteFontFile 을 만듭니다.
IDWriteFontFile* pFontFile; 
if (SUCCEEDED(hr)) 
{ 
  hr = pDWriteFactory->CreateFontFileReference(pFilePath, /* lastWriteTime*/ nullptr, &pFontFile); 
} 

 
4. AddFontFile 메서드를 사용하여 글꼴 집합 작성기에서 IDWriteFontFile 개체를 추가합니다.

hr = pFontSetBuilder->AddFontFile(pFontFile); 

CreateFontFileReference 호출에 지정된 파일 경로가 지원되는 OpenType 파일 이외의 항목이라고 하는 경우 AddFontFile에 대한 호출은 오류를 반환합니다DWRITE_E_FILEFORMAT.

  1. 모든 파일이 글꼴 집합 작성기에 추가되면 사용자 지정 글꼴 집합을 만들 수 있습니다.
IDWriteFontSet* pFontSet; 
hr = pFontSetBuilder->CreateFontSet(&pFontSet); 

 

앱이 Windows 10 크리에이터스 업데이트 이전 버전의 Windows 10 실행해야 하는 경우 AddFontFile 메서드를 사용할 수 없습니다. IDWriteFactory3 인터페이스를 만든 다음 QueryInterface를 사용하여 IDWriteFactory5 인터페이스를 가져와 가용성을 검색할 수 있습니다. 이 인터페이스가 성공하면 IDWriteFontSetBuilder1 인터페이스 및 AddFontFile 메서드도 사용할 수 있습니다.

AddFontFile 메서드를 사용할 수 없는 경우 IDWriteFontSetBuilder::AddFontFaceReference 메서드를 사용하여 개별 글꼴 얼굴을 추가해야 합니다. 여러 얼굴을 포함하는 OpenType 글꼴 컬렉션 파일을 허용하기 위해 IDWriteFontFile::Analyze 메서드를 사용하여 파일 내에 포함된 얼굴 수를 확인할 수 있습니다. 프로세스는 다음과 같습니다.

1. IDWriteFactory3 인터페이스를 만들어 시작합니다.
IDWriteFactory3* pDWriteFactory; 
HRESULT hr = DWriteCreateFactory( 
DWRITE_FACTORY_TYPE_SHARED, 
  __uuidof(IDWriteFactory5), 
  reinterpret_cast<IUnknown**>(&pDWriteFactory) 
); 
  1. 팩터리를 사용하여 IDWriteFontSetBuilder 인터페이스를 가져옵니다.
IDWriteFontSetBuilder* pFontSetBuilder; 
if (SUCCEEDED(hr)) 
{ 
  hr = pDWriteFactory->CreateFontSetBuilder(&pFontSetBuilder); 
} 
  1. 각 글꼴 파일에 대해 위와 같이 IDWriteFontFile을 만듭니다.
IDWriteFontFile* pFontFile; 
if (SUCCEEDED(hr)) 
{ 
  hr = pDWriteFactory->CreateFontFileReference(pFilePath, /* lastWriteTime*/ nullptr, &pFontFile); 
} 

글꼴 집합 작성기에서 파일을 직접 추가하는 대신 얼굴 수를 확인하고 개별 IDWriteFontFaceReference 개체를 만들어야 합니다. 
4. Analyze 메서드를 사용하여 파일의 얼굴 수를 가져옵니다. 

BOOL isSupported; 
DWRITE_FONT_FILE_TYPE fileType; 
UINT32 numberOfFonts; 
hr = pFontFile->Analyze(&isSupported, &fileType, /* face type */ nullptr, &numberOfFonts); 

Analyze 메서드는 isSupported 및 fileType 매개 변수에 대한 값도 설정합니다. 파일이 지원되는 형식이 아닌 경우 isSupported는 FALSE이며 파일 무시와 같은 적절한 작업을 수행할 수 있습니다. 
5. numberOfFonts 매개 변수에 설정된 글꼴 수를 반복합니다. 루프 내에서 각 파일/인덱스 쌍에 대한 IDWriteFontFaceReference 를 만들고 이를 글꼴 집합 작성기에 추가합니다. 

for (uint32_t fontIndex = 0; fontIndex < numberOfFonts; fontIndex++) 
{ 
  IDWriteFontFaceReference* pFontFaceReference;
  hr = pDWriteFactory->CreateFontFaceReference(pFontFile, fontIndex, DWRITE_FONT_SIMULATIONS_NONE, &pFontFaceReference);

  if (SUCCEEDED(hr))
  {
    hr = pFontSetBuilder->AddFontFaceReference(pFontFaceReference);
  }
} 
  1. 모든 얼굴이 글꼴 집합 작성기에 추가된 후 위에 표시된 대로 사용자 지정 글꼴 집합을 만듭니다.

Windows 10 크리에이터스 업데이트 실행할 때 기본 설정 AddFontFile 메서드를 사용하도록 앱을 설계할 수 있지만 이전 Windows 10 버전에서 실행할 때 AddFontFaceReference 메서드를 사용하도록 대체합니다. 위에서 설명한 대로 IDWriteFactory5 인터페이스의 가용성을 테스트한 다음 그에 따라 분기합니다. 이 방법은 DirectWrite 사용자 지정 글꼴 집합 샘플에 설명되어 있습니다. 

로컬 파일 시스템에서 알려진 글꼴을 사용하여 글꼴 집합 만들기

위에서 설명한 것처럼 글꼴 집합의 각 글꼴 얼굴 참조는 가족 이름 및 글꼴 두께와 같은 특정 정보 속성과 연결됩니다. 위에 나열된 API 호출을 사용하여 사용자 지정 글꼴을 글꼴 집합 작성기에 추가하면 이러한 정보 속성은 글꼴이 추가될 때 읽는 실제 글꼴 데이터에서 직접 가져옵니다. 그러나 앱에 글꼴에 대한 다른 정보 원본이 있는 경우 이러한 속성에 대한 고유한 사용자 지정 값을 제공할 수도 있습니다. 

이 방법이 유용할 수 있는 방법의 예로, 앱이 앱 내에서 특정 사용자 인터페이스 요소를 표시하는 데 사용되는 일부 글꼴을 번들로 묶는다고 가정합니다. 새 앱 버전과 같은 경우 앱이 이러한 요소에 사용하는 특정 글꼴을 변경해야 할 수 있습니다. 앱에 특정 글꼴에 대한 인코딩된 참조가 있는 경우 한 글꼴을 다른 글꼴로 교체하려면 해당 참조를 하나씩 변경해야 합니다. 대신 앱에서 사용자 지정 속성을 사용하여 렌더링되는 요소 또는 텍스트의 형식에 따라 기능 별칭을 할당하는 경우 각 별칭을 한 곳에서 특정 글꼴에 매핑한 다음 글꼴이 만들어지고 조작되는 모든 컨텍스트에서 별칭을 사용하는 경우 한 글꼴을 다른 글꼴로 바꾸려면 별칭이 특정 글꼴에 매핑되는 위치만 변경하면 됩니다. 

IDWriteFontSetBuilder::AddFontFaceReference 메서드가 호출될 때 정보 속성에 대한 사용자 지정 값을 할당할 수 있습니다. 이 작업을 수행하는 방법은 다음과 같습니다. 모든 Windows 10 버전에서 사용할 수 있습니다. 

위에 표시된 것처럼 먼저 IDWriteFactory3IDWriteFontSet 인터페이스를 가져옵니다. 추가할 각 사용자 지정 글꼴 면에 대해 위에 표시된 대로 IDWriteFontFaceReference를 만듭니다. 이 글꼴 집합 작성기(위에 표시된 5단계의 루프 내에서)에 추가되기 전에 앱은 사용할 사용자 지정 속성 값을 정의합니다. 

사용자 지정 속성 값 집합은 DWRITE_FONT_PROPERTY 구조의 배열을 사용하여 정의됩니다. 이들 각각은 DWRITE_FONT_PROPERTY_ID 열거형의 특정 속성과 사용할 해당 속성 값을 식별합니다.  

모든 속성 값은 문자열로 할당됩니다. 나중에 사용자에게 표시될 수 있는 경우 다른 언어에 대해 지정된 속성의 대체 값이 설정될 수 있지만 필수는 아닙니다. 또한 앱에서 사용자 지정 속성 값을 설정하는 경우 지정된 값만 글꼴 집합 내에서 사용됩니다. DirectWrite 글꼴 집합에 사용되는 정보 속성에 대한 글꼴에서 직접 값을 파생하지 않습니다. 

다음 예제에서는 세 가지 정보 속성인 패밀리 이름, 전체 이름 및 글꼴 가중치에 대한 사용자 지정 값을 정의합니다. 

DWRITE_FONT_PROPERTY props[] = 
{ 
  { DWRITE_FONT_PROPERTY_ID_FAMILY_NAME, L"My Icon Font", L"en-US" }, 
  { DWRITE_FONT_PROPERTY_ID_FULL_NAME, L"My Icon Font", L"en-US" }, 
  { DWRITE_FONT_PROPERTY_ID_WEIGHT, L"400", nullptr } 
}; 
               
            

글꼴에 대한 속성 값의 원하는 배열을 정의한 후 AddFontFaceRefence를 호출하여 속성 배열과 글꼴 얼굴 참조를 전달합니다. 

hr = pFontSetBuilder->AddFontFaceReference(pFontFaceReference, props, ARRAYSIZE(props)); 

 

모든 사용자 지정 글꼴 면이 해당 사용자 지정 속성과 함께 글꼴 집합 작성기에 추가되면 위에 표시된 대로 사용자 지정 글꼴 집합을 만듭니다. 

웹에서 알려진 원격 글꼴을 사용하여 사용자 지정 글꼴 집합 만들기

사용자 지정 속성은 원격 글꼴 작업에 중요합니다. 각 글꼴 얼굴 참조에는 글꼴의 특징을 지정하고 다른 글꼴과 구분하기 위한 몇 가지 정보 속성이 있어야 합니다. 원격 글꼴의 글꼴 데이터는 로컬이 아니으므로 DirectWrite 글꼴 데이터에서 직접 속성을 파생시킬 수 없습니다. 따라서 글꼴 집합 작성기에서 원격 글꼴을 추가할 때 속성을 명시적으로 제공해야 합니다.

글꼴 집합에 원격 글꼴을 추가하기 위한 API 호출 시퀀스는 이전 시나리오에 대해 설명한 시퀀스와 유사합니다. 그러나 글꼴 데이터는 원격이므로 실제 글꼴 데이터를 읽는 작업은 로컬 스토리지의 파일로 작업할 때와 다릅니다. 이 경우 새로운 하위 수준 인터페이스인 IDWriteRemoteFontFileLoader가 Windows 10 크리에이터스 업데이트 추가되었습니다. 

원격 글꼴 파일 로더를 사용하려면 먼저 DirectWrite 팩터리에 등록해야 합니다. 연결된 글꼴이 사용되는 동안 앱에서 로더를 유지해야 합니다. 글꼴이 더 이상 사용되지 않고 팩터리를 삭제하기 전의 어느 시점에서 로더의 등록을 취소해야 합니다. 이 작업은 로더 개체를 소유하는 클래스의 소멸자에서 수행할 수 있습니다. 이러한 단계는 다음과 같습니다. 

원격 글꼴을 사용하여 사용자 지정 글꼴 집합을 만드는 방법은 다음과 같습니다. 이렇게 하려면 Windows 10 크리에이터스 업데이트 필요합니다.  

1. 위에 표시된 대로 IDWriteFactory5 인터페이스를 만듭니다.  2. 위에 표시된 대로 IDWriteFontSetBuilder 인터페이스를 만듭니다.  3. 팩터리를 사용하여 IDWriteRemoteFontFileLoader를 가져옵니다. 
IDWriteRemoteFontFileLoader* pRemoteFontFileLoader; 
if (SUCCEEDED(hr)) 
{ 
    hr = pDWriteFactory->CreateHttpFontFileLoader( 
        /* referrerURL */ nullptr, 
        /* extraHeaders */ nullptr, 
        &pRemoteFontFileLoader 
    ); 
} 

그러면 앱 대신 글꼴 데이터를 다운로드하기 위한 HTTP 상호 작용을 처리할 수 있는 원격 글꼴 파일 로더 인터페이스의 시스템 제공 구현이 반환됩니다. 글꼴의 원본인 글꼴 서비스 또는 서비스에서 필요한 경우 참조 URL 또는 추가 헤더를 지정할 수 있습니다.  

중요

보안 정보: 원격 글꼴을 가져오려고 하면 공격자가 호출할 의도한 서버를 스푸핑할 가능성이 있습니다. 이 경우 대상 및 참조자 URL 및 헤더 세부 정보가 공격자에게 공개됩니다. 앱 개발자는 이 위험을 완화할 책임이 있습니다. HTTP 대신 HTTPS 프로토콜을 사용하는 것이 좋습니다. 

 

단일 원격 글꼴 파일 로더는 여러 글꼴에 사용할 수 있지만 참조자 URL 또는 추가 헤더에 대한 요구 사항이 다른 여러 서비스에서 글꼴을 가져오는 경우 다른 로더를 사용할 수 있습니다. 
4. 팩터리에 원격 글꼴 파일 로더를 등록합니다. 

 if (SUCCEEDED(hr)) 
 { 
     hr = pDWriteFactory->RegisterFontFileLoader(pRemoteFontFileLoader); 
 } 

이 시점에서 사용자 지정 글꼴 집합을 만드는 단계는 두 가지 중요한 예외를 제외하고 알려진 로컬 글꼴 파일에 대해 설명된 단계와 유사합니다. 먼저 IDWriteFontFile 개체는 팩터리를 사용하는 대신 원격 글꼴 파일 로더 인터페이스를 사용하여 만들어집니다. 둘째, 글꼴 데이터가 로컬이 아니므로 Analyze 메서드를 사용할 수 없습니다. 대신, 앱은 원격 글꼴 파일이 OpenType 글꼴 컬렉션 파일인지 여부를 알고 있어야 하며, 그렇다면 사용할 컬렉션 내의 글꼴과 각각에 대한 인덱스를 알아야 합니다. 따라서 나머지 단계는 다음과 같습니다. 
5. 각 원격 글꼴 파일에 대해 원격 글꼴 파일 로더 인터페이스를 사용하여 글꼴 파일에 액세스하는 데 필요한 URL을 지정하여 IDWriteFontFile을 만듭니다. 

 IDWriteFontFile* pFontFile; 
 hr = pRemoteFontFileLoader->CreateFontFileReferenceFromUrl( 
     pDWriteFactory, 
     /* baseUrl */ L"https://github.com/", 
     /* fontFileUrl */ L"winjs/winjs/blob/master/src/fonts/Symbols.ttf?raw=true", 
     &pFontFile 
 ); 

전체 URL은 fontFileUrl 매개 변수에 지정하거나 기본 및 상대 부분으로 분할할 수 있습니다. 기본 URL이 지정된 경우 baseUrl 및 fontFileUrl 값의 연결은 전체 URL을 제공해야 합니다. DirectWrite 추가 구분 기호를 제공하지 않습니다.

중요

보안/성능 참고: 원격 글꼴을 가져오려고 하면 Windows가 서버로부터 응답을 받을 것이라는 보장은 없습니다. 경우에 따라 서버가 잘못된 상대 URL에 대해 파일을 찾을 수 없는 오류로 응답하지만 잘못된 요청이 여러 번 수신되면 응답을 중지할 수 있습니다. 서버가 응답하지 않으면 Windows는 시간이 초과되지만 여러 페치를 시작하는 경우 몇 분 정도 걸릴 수 있습니다. 호출이 수행될 때 URL이 유효한지 확인하기 위해 할 수 있는 작업을 수행해야 합니다. 

 

또한 URL은 원시 OpenType 글꼴 파일(.ttf, .otf, .ttc, .otc)을 가리킬 수 있지만 WOFF 또는 WOFF2 컨테이너 파일의 글꼴을 가리킬 수도 있습니다. WOFF 또는 WOFF2 파일을 참조하는 경우 원격 글꼴 파일 로더의 DirectWrite 구현은 컨테이너 파일에서 글꼴 데이터의 압축을 자동으로 해제합니다. 
6. 사용할 원격 글꼴 파일 내의 각 글꼴 얼굴 인덱스에 대해 IDWriteFontFaceReference를 만듭니다. 

 IDWriteFontFaceReference* pFontFaceReference; 
 hr = pDWriteFactory->CreateFontFaceReference(pFontFile, /* faceIndex */ 0, DWRITE_FONT_SIMULATIONS_NONE, &pFontFaceReference);
  1. 위와 같이 글꼴 면에 대한 사용자 지정 속성을 정의합니다. 
  2. 위에 표시된 것처럼 글꼴 집합 작성기에서 사용자 지정 속성과 함께 글꼴 얼굴 참조를 추가합니다. 
  3. 모든 글꼴이 글꼴 집합 작성기에 추가된 후 위에 표시된 대로 글꼴 집합을 만듭니다. 
  4. 원격 글꼴이 더 이상 사용되지 않는 시점에 원격 글꼴 파일 로더의 등록을 취소합니다. 
hr = pDWriteFactory->UnregisterFontFileLoader(pRemoteFontFileLoader); 

사용자 지정 원격 글꼴이 있는 사용자 지정 글꼴 집합이 만들어지면 글꼴 집합에 원격 글꼴에 대한 참조 및 정보 속성이 포함되지만 실제 데이터는 여전히 원격입니다. 원격 글꼴에 대한 DirectWrite 지원을 통해 글꼴 집합에서 글꼴 얼굴 참조를 유지 관리하고 레이아웃 및 렌더링에 사용할 글꼴을 선택할 수 있지만 텍스트 레이아웃이 수행될 때와 같이 실제 데이터가 다운로드될 때까지는 실제 데이터가 다운로드되지 않습니다.  

앱은 글꼴 데이터를 다운로드할 DirectWrite 요청한 다음, 글꼴 처리가 시작되기 전에 성공적인 다운로드 확인을 대기하여 선행 접근 방식을 취할 수 있습니다. 그러나 네트워크 다운로드는 예측할 수 없는 기간의 대기 시간을 의미하며 성공도 불확실합니다. 따라서 일반적으로 원하는 원격 글꼴의 다운로드를 병렬로 요청한 다음 원하는 글꼴이 다운로드되면 결과를 업데이트하는 동안 이미 로컬인 대체 또는 대체 글꼴을 사용하여 레이아웃 및 렌더링을 처음에 수행할 수 있도록 다른 접근 방식을 사용하는 것이 좋습니다. 

전체 글꼴이 사용되기 전에 다운로드하도록 요청하려면 IDWriteFontFaceReference::EnqueueFontDownloadRequest 메서드를 사용할 수 있습니다. 글꼴이 매우 큰 경우 특정 문자열을 처리하는 데 데이터의 일부만 필요할 수 있습니다. DirectWrite 특정 콘텐츠에 필요한 글꼴 데이터의 일부인 EnqueueCharacterDownloadRequestEnqueueGlyphDownloadRequest를 요청하는 데 사용할 수 있는 추가 메서드를 제공합니다.  

앱에서 수행할 접근 방식은 로컬, 대체 또는 대체 글꼴을 사용하여 처음에 처리를 수행할 수 있도록 하는 것이라고 가정합니다. IDWriteFontFallback::MapCharacters 메서드를 사용하여 로컬 대체 글꼴을 식별할 수 있으며 기본 설정 글꼴 다운로드 요청을 자동으로 큐에 추가합니다. 또한 IDWriteTextLayout을 사용하고 레이아웃의 텍스트 중 일부 또는 전부가 원격 글꼴 참조를 사용하여 서식이 지정된 경우 DirectWrite MapCharacters 메서드를 자동으로 사용하여 로컬 대체 글꼴을 가져오고 원격 글꼴 데이터를 다운로드하는 요청을 큐에 추가합니다. 

DirectWrite 각 팩터리에 대한 글꼴 다운로드 큐를 유지 관리하며 위에서 언급한 메서드를 사용하여 수행한 요청은 해당 큐에 추가됩니다. 글꼴 다운로드 큐는 IDWriteFactory3::GetFontDownloadQueue 메서드를 사용하여 가져올 수 있습니다. 

다운로드 요청이 수행되었지만 글꼴 데이터가 이미 로컬인 경우 no-op: 아무것도 다운로드 큐에 추가되지 않습니다. 앱은 IDWriteFontDownloadQueue::IsEmpty 메서드를 호출하여 큐가 비어 있는지 또는 보류 중인 다운로드 요청이 있는지 검사 수 있습니다. 

원격 글꼴 요청이 큐에 추가된 후 다운로드 프로세스를 시작해야 합니다. IDWriteTextLayout에서 원격 글꼴을 사용하는 경우 앱이 GetLineMetrics 또는 Draw 메서드와 같은 레이아웃 또는 렌더링 작업을 강제하는 IDWriteTextLayout 메서드를 호출하면 다운로드가 자동으로 시작됩니다. 다른 시나리오에서는 앱이 IDWriteFontDownloadQueue::BeginDownload를 호출하여 다운로드를 직접 시작해야 합니다.  

다운로드가 완료되면 보류 중인 작업을 진행하거나 처음에 대체 글꼴로 수행된 작업을 반복하는 등 적절한 작업을 수행하는 것은 앱에 달려 있습니다. (DirectWrite 텍스트 레이아웃을 사용하는 경우 IDWriteTextLayout3::InvalidateLayout을 사용하여 대체 글꼴을 사용하여 계산된 임시 결과를 지울 수 있습니다.) 다운로드 프로세스가 완료될 때 앱에 알림을 받고 적절한 작업을 수행하려면 앱이 IDWriteFontDownloadListener 인터페이스의 구현을 제공하고 이를 BeginDownload 호출에 전달해야 합니다. 

중요

보안/성능 참고: 원격 글꼴을 가져오려고 하면 Windows가 서버로부터 응답을 받을 것이라는 보장은 없습니다. 서버가 응답하지 않으면 여러 원격 글꼴을 가져오지만 실패하는 경우 몇 분 정도 걸릴 수 있지만 Windows는 결국 시간이 초과됩니다. BeginDownload 호출이 즉시 반환됩니다. 앱은 IDWriteFontDownloadListener::D ownloadCompleted가 호출될 때까지 기다리는 동안 UI를 차단해서는 안 됩니다. 

 

DirectWrite 글꼴 다운로드 큐 및 IDWriteFontDownloadListener 인터페이스와의 이러한 상호 작용의 샘플 구현은 DirectWrite 사용자 지정 글꼴 집합 샘플DirectWrite 다운로드 가능한 글꼴 샘플에서도 볼 수 있습니다. 

메모리에 로드된 글꼴 데이터를 사용하여 사용자 지정 글꼴 집합 만들기

글꼴 파일에서 데이터를 읽기 위한 하위 수준 작업이 로컬 디스크의 파일과 웹의 원격 파일에 대해 다른 것처럼 메모리 버퍼에 로드된 글꼴 데이터도 마찬가지입니다. 메모리 내 글꼴 데이터를 처리하기 위한 새로운 하위 수준 인터페이스가 Windows 10 크리에이터스 업데이트 IDWriteInMemoryFontFileLoader에 추가되었습니다. 

원격 글꼴 파일 로더와 마찬가지로 메모리 내 글꼴 파일 로더는 먼저 DirectWrite 팩터리에 등록해야 합니다. 로더와 연결된 글꼴이 사용되는 한 앱에서 로더를 유지해야 합니다. 글꼴이 더 이상 사용되지 않고 팩터리를 삭제하기 전에 로더를 등록 취소해야 합니다. 이 작업은 로더 개체를 소유하는 클래스의 소멸자에서 수행할 수 있습니다. 이러한 단계는 아래에 나와 있습니다. 

앱에 데이터가 나타내는 글꼴 면에 대한 별도의 정보가 있는 경우 사용자 지정 속성이 지정된 글꼴 집합 작성기에서 개별 글꼴 얼굴 참조를 추가할 수 있습니다. 그러나 글꼴 데이터는 로컬 메모리에 있으므로 필요하지 않습니다. DirectWrite 데이터를 직접 읽고 속성 값을 파생할 수 있습니다. 

DirectWrite 글꼴 데이터가 디스크가 아닌 메모리에 있는 OpenType 파일(.ttf, .otf, .ttc, .otc)과 동일한 원시 OpenType 형식이라고 가정합니다. 데이터는 WOFF 또는 WOFF2 컨테이너 형식일 수 없습니다. 데이터는 OpenType 글꼴 컬렉션을 나타낼 수 있습니다. 사용자 지정 속성을 사용하지 않는 경우 IDWriteFontSetBuilder1::AddFontFile 메서드를 사용하여 한 번의 호출로 데이터의 모든 글꼴 얼굴을 추가할 수 있습니다. 

메모리 내 시나리오의 중요한 고려 사항은 데이터의 수명입니다. 버퍼에 대한 포인터가 소유자가 있다는 명확한 표시 없이 DirectWrite 제공된 경우 DirectWrite 소유할 새 메모리 버퍼로 데이터 복사본을 만듭니다. 데이터 복사 및 추가 메모리 할당을 방지하기 위해 앱은 IUnknown을 구현하고 글꼴 데이터가 포함된 메모리 버퍼를 소유하는 데이터 소유자 개체를 전달할 수 있습니다. 이 인터페이스를 구현하면 DirectWrite 개체의 ref 개수에 를 추가하여 소유된 데이터의 수명을 보장할 수 있습니다. 

메모리 내 글꼴 데이터를 사용하여 사용자 지정 글꼴 집합을 만드는 방법은 다음과 같습니다. 이렇게 하려면 Windows 10 크리에이터스 업데이트 필요합니다. 이렇게 하면 IUnknown을 구현하고 메모리 버퍼 및 버퍼 크기에 대한 포인터를 반환하는 메서드도 있는 앱 구현 데이터 소유자 개체를 가정합니다. 

1. 위에 표시된 대로 IDWriteFactory5 인터페이스를 만듭니다. 2. 위에 표시된 것처럼 [**IDWriteFontSetBuilder1**](/windows/win32/api/dwrite_3/nn-dwrite_3-idwritefontsetbuilder1) 인터페이스를 만듭니다. 3. 팩터리를 사용하여 IDWriteInMemoryFontFileLoader를 가져옵니다. 
 IDWriteInMemoryFontFileLoader* pInMemoryFontFileLoader; 
if (SUCCEEDED(hr)) 
{ 
    hr = pDWriteFactory->CreateInMemoryFontFileLoader(&pInMemoryFontFileLoader); 
}

그러면 메모리 내 글꼴 파일 로더 인터페이스의 시스템 제공 구현이 반환됩니다. 
4. 메모리 내 글꼴 파일 로더를 팩터리에 등록합니다. 

if (SUCCEEDED(hr)) 
{ 
    hr = pDWriteFactory->RegisterFontFileLoader(pInMemoryFontFileLoader); 
}

 
5. 각 메모리 내 글꼴 파일에 대해 메모리 내 글꼴 파일 로더를 사용하여 IDWriteFontFile을 만듭니다. 

IDWriteFontFile* pFontFile; 
hr = pInMemoryFontFileLoader->CreateInMemoryFontFileReference( 
    pDWriteFactory, 
    pFontDataOwner->fontData /* returns void* */, 
    pFontDataOwner->fontDataSize /* returns UINT32 */, 
    pFontDataOwner /* ownerObject, owns the memory with font data and implements IUnknown */, 
    &pFontFile 
); 

 
6. 위에 표시된 대로 AddFontFile 메서드를 사용하여 글꼴 집합 작성기에서 IDWriteFontFile 개체를 추가합니다.  필요한 경우 앱은 IDWriteFontFile을 기반으로 개별 IDWriteFontFaceReference 개체를 만들고, 필요에 따라 각 글꼴 얼굴 참조에 대한 사용자 지정 속성을 정의한 다음, 위에 표시된 것처럼 AddFontFaceReference 메서드를 사용하여 사용자 지정 속성을 사용하여 글꼴 집합에 글꼴 얼굴 참조를 추가할 수 있습니다. 
7. 모든 글꼴이 글꼴 집합 작성기에 추가된 후 위에 표시된 대로 사용자 지정 글꼴 집합을 만듭니다. 
8. 메모리 내 글꼴이 더 이상 사용되지 않는 시점에 메모리 내 글꼴 파일 로더의 등록을 취소합니다. 

hr = pDWriteFactory->UnregisterFontFileLoader(pInMemoryFontFileLoader);

 

고급 시나리오

일부 앱에는 위에서 설명한 것보다 고급 처리가 필요한 특별한 요구 사항이 있을 수 있습니다. 

글꼴 집합 결합

일부 앱은 다른 글꼴 집합의 항목 조합을 구성하는 글꼴 집합을 만들어야 할 수 있습니다. 예를 들어 앱은 시스템에 설치된 모든 글꼴을 사용자 지정 글꼴 선택과 결합하거나 특정 조건과 다른 글꼴과 일치하는 설치된 글꼴을 결합하는 글꼴 집합을 만들 수 있습니다. DirectWrite 글꼴 집합의 조작 및 결합을 지원하는 API가 있습니다. 

둘 이상의 글꼴 집합을 결합하기 위해 IDWriteFontSetBuilder::AddFontSet 메서드는 지정된 글꼴 집합의 모든 글꼴을 단일 호출로 글꼴 집합 작성기에 추가합니다. 기존 글꼴 집합의 특정 글꼴만 새 글꼴 집합에서 원하는 경우 IDWriteFontSet::GetMatchingFonts 메서드를 사용하여 지정된 속성과 일치하는 글꼴만 포함하도록 필터링된 새 글꼴 집합 개체를 파생할 수 있습니다. 이러한 메서드는 두 개 이상의 기존 글꼴 집합에서 글꼴을 결합하는 사용자 지정 글꼴 집합을 쉽게 만들 수 있는 방법을 제공합니다.

로컬 WOFF 또는 WOFF2 글꼴 데이터 사용

앱에 로컬 파일 시스템 또는 메모리 버퍼에 글꼴 파일이 있지만 WOFF 또는 WOFF2 컨테이너 형식을 사용하는 경우 DirectWrite(Windows 10 작성자 업데이트 이상)는 IDWriteFontFileStream을 반환하는 컨테이너 형식 IDWriteFactory5::UnpackFontFile의 압축을 풉니다. 

그러나 앱은 IDWriteFontFileStream 을 글꼴 파일 로더 개체로 가져오는 방법이 필요합니다. 이 작업을 수행하는 한 가지 방법은 스트림을 래핑하는 사용자 지정 IDWriteFontFileLoader 구현을 만드는 것입니다. 다른 글꼴 파일 로더와 마찬가지로 이 로더를 사용하기 전에 등록해야 하며 팩터리를 scope 나가기 전에 등록 취소해야 합니다.  

사용자 지정 로더를 원시(압축되지 않은) 글꼴 파일과 함께 사용하는 경우 앱은 해당 파일을 처리하기 위해 IDWriteFontFileStream 인터페이스의 사용자 지정 구현도 제공해야 합니다. 그러나 위에서 설명한 API를 사용하여 원시 글꼴 파일을 처리하는 더 쉬운 방법이 있습니다. 압축된 글꼴 파일과 원시 글꼴 파일에 대해 별도의 코드 경로를 사용하여 사용자 지정 스트림 구현의 필요성을 피할 수 있습니다. 

사용자 지정 글꼴 파일 로더 개체를 만든 후 압축된 글꼴 파일 데이터는 앱별 수단을 통해 로더에 추가됩니다. 로더는 여러 글꼴 파일을 처리할 수 있으며, 각 파일은 DirectWrite 불투명한 앱 정의 키를 사용하여 식별됩니다. 압축된 글꼴 파일이 로더에 추가된 후 IDWriteFactory::CreateCustomFontFileReference 메서드를 사용하여 지정된 키로 식별된 글꼴 데이터에 대해 해당 로더를 기반으로 IDWriteFontFile 을 가져옵니다.  

글꼴 데이터의 실제 압축 해제는 글꼴이 로더에 추가될 때 수행할 수 있지만, 글꼴 데이터를 처음 읽어야 할 때 DirectWrite 호출하는 IDWriteFontFileLoader::CreateStreamFromKey 메서드에서도 처리할 수 있습니다. 

IDWriteFontFile 개체를 만든 후 사용자 지정 글꼴 집합에 글꼴을 추가하는 나머지 단계는 위에서 설명한 대로 됩니다. 

이 방법을 사용하는 구현은 DirectWrite 사용자 지정 글꼴 집합 샘플에 설명되어 있습니다. 

사용자 지정 하위 수준 네트워크 구현에서 DirectWrite 원격 글꼴 메커니즘 사용

원격 글꼴을 처리하기 위한 DirectWrite 메커니즘은 원격 글꼴에 대한 글꼴 얼굴 참조를 포함하는 글꼴 집합, 글꼴 데이터의 지역성 확인, 글꼴 다운로드 요청에 대한 큐 관리, 실제 다운로드를 처리하는 하위 수준 메커니즘 등 상위 수준 메커니즘으로 나눌 수 있습니다. 일부 앱은 상위 수준의 원격 글꼴 메커니즘을 활용하려고 할 수 있지만 HTTP 이외의 프로토콜을 사용하여 서버와 통신하는 것과 같은 사용자 지정 네트워크 상호 작용도 필요할 수 있습니다. 

이 경우 앱은 필요한 방법으로 다른 하위 수준 인터페이스와 상호 작용하는 IDWriteRemoteFontFileLoader 인터페이스의 사용자 지정 구현을 만들어야 합니다. 또한 앱은 IDWriteRemoteFontFileStream 및 IDWriteAsyncResult와 같은 하위 수준 인터페이스의 사용자 지정 구현을 제공해야 합니다. 이러한 세 인터페이스에는 DirectWrite 다운로드 작업 중에 호출할 콜백 메서드가 있습니다. 

IDWriteFontDownloadQueue::BeginDownload가 호출되면 DirectWrite 원격 글꼴 파일 로더에 데이터 로컬성을 쿼리하고 원격 스트림을 요청합니다. 데이터가 로컬이 아니면 스트림의 BeginDownload 메서드를 호출합니다. 스트림 구현은 해당 호출을 차단해서는 안 되지만 즉시 반환되어야 하며, 비동기 다운로드 작업을 기다리는 데 사용할 대기 핸들 DirectWrite 제공하는 IDWriteAsyncResult 개체를 다시 전달해야 합니다. 사용자 지정 스트림 구현은 원격 통신을 처리합니다. 완료 이벤트가 발생하면 DirectWrite IDWriteAsyncResult::GetResult를 호출하여 작업 결과를 확인합니다. 결과가 성공하면 다운로드한 범위에 대한 스트림에 대한 후속 ReadFragment 호출이 성공할 것으로 예상됩니다. 

중요

보안/성능 참고: 원격 글꼴을 가져오려고 하면 공격자가 호출되는 의도한 서버를 스푸핑하거나 서버가 응답하지 않을 수 있는 가능성이 일반적으로 존재합니다. 사용자 지정 네트워크 상호 작용을 구현하는 경우 타사 서버를 처리할 때보다 완화를 더 제어할 수 있습니다. 그러나 정보 공개 또는 서비스 거부를 방지하기 위해 적절한 완화를 고려하는 것은 사용자에게 달려 있습니다. HTTPS와 같은 보안 프로토콜을 사용하는 것이 좋습니다. 또한 DirectWrite 반환된 이벤트 핸들이 결국 설정되도록 일정 시간 제한으로 빌드해야 합니다. 

 

이전 Windows 버전에서 시나리오 지원

설명된 시나리오는 이전 버전의 Windows에서 DirectWrite 지원될 수 있지만 Windows 10 이전에 사용할 수 있었던 더 제한된 API를 사용하여 앱 부분에서 훨씬 더 많은 사용자 지정 구현이 필요합니다. 자세한 내용은 사용자 지정 글꼴 컬렉션(Windows 7/8)을 참조하세요.