次の方法で共有


カスタム フォント コレクション (Windows 7/8)

DirectWriteIDWriteFactory::GetSystemFontCollection メソッドを使用して、システム フォント コレクションにアクセスできます。 これは、最も頻繁に使用されるフォント コレクションです。 ただし、一部のアプリケーションでは、含まれているフォント ファイルやアプリケーションに埋め込まれたフォント ファイルなど、システムにインストールされていないフォントを使用する必要があります。

目的のフォントがシステム フォント コレクションにない場合は、 IDWriteFontCollection から派生したカスタム フォント コレクションを作成できます。

この概要は、次の部分で構成されます。

フォント コレクション ローダーの登録と登録解除

フォント コレクション ローダーを登録する場合は、 IDWriteFactory::RegisterFontCollectionLoader メソッドを使用し、アプリケーションによってシングルトン オブジェクトとして実装された IDWriteFontCollectionLoader インターフェイスを渡します。 このオブジェクトは、カスタム コレクションが要求されたときにフォントを読み込みます。 システム フォント コレクションとカスタム フォント コレクションの両方がキャッシュされるため、フォントは 1 回だけ読み込まれます。

フォント コレクション ローダーは、 IDWriteFactory::UnregisterFontCollectionLoader を使用して最終的にアンロードする必要があります。

注意

フォント コレクション ローダーを登録すると、参照カウントが追加されます。デストラクター内から UnregisterFontCollectionLoader を 呼び出さないでください。コレクション ローダー オブジェクトは登録解除されません。

 

IDWriteFontCollectionLoader

IDWriteFontFileEnumerator オブジェクトは、IDWriteFactory::CreateCustomFontCollection を使用して作成し、アプリケーション定義キーを渡します。 キーは void ポインターであり、データ型、形式、および意味はアプリケーションによって定義され、フォント システムに対して不透明です。

キーは何でもかまいませんが、DirectWriteでは各キーが両方である必要があります。

  • ローダーのスコープ内の 1 つのフォント コレクションに固有です。
  • ファクトリを使用してローダーが登録解除されるまで有効です。

CreateCustomFontCollection メソッドが呼び出されると、DirectWriteは、アプリケーションによってシングルトン オブジェクトとして実装された IDWriteFontCollectionLoader インターフェイスを呼び出します。 IDWriteFontCollectionLoader::CreateEnumeratorFromKey コールバック メソッドは、アプリケーションによって実装された IDWriteFontFileEnumerator オブジェクトを取得するために、DirectWriteによって使用されます。 コレクションの作成に使用されている IDWriteFactory オブジェクトはこのメソッドに渡され、フォント ファイル列挙子がコレクションに含める IDWriteFontFile オブジェクトを作成するために使用する必要があります。

このメソッドに渡されるキーはフォント コレクションを識別し、 CreateCustomFontCollection に渡されるキーと同じです。

IDWriteFontFileEnumerator

CreateEnumeratorFromKey メソッドによって作成されたアプリケーション定義の IDWriteFontFileEnumerator オブジェクトを使用して、コレクション内のフォント ファイルを列挙し、各ファイルの IDWriteFontFile オブジェクトを作成します。 IDWriteFontFileEnumerator::MoveNext メソッドは、位置を次のフォント ファイルに変更します。 位置にファイルがある場合は、 hasCurrentFileTRUE に設定します。 それ以外の場合は FALSE に設定され、メソッドは S_OKを返します。

注意

フォント ファイル列挙子は、最初の要素の前に配置を開始し、 MoveNext の最初の呼び出しで詳細設定する必要があります。

 

IDWriteFontFile オブジェクトは、IDWriteFontFileEnumerator::GetCurrentFontFile メソッドによって出力されます。 MoveNext がまだ呼び出されていないか、hasCurrentFile が FALSE に設定されているため、現在の位置にフォント ファイルがない場合、GetCurrentFontFileE_FAILを返します。

CreateCustomFontFileReference

GetCurrentFontFile によって出力される IDWriteFontFile オブジェクトは、IDWriteFactory::CreateCustomFontFileReference を呼び出すことによって作成できます。 フォント ファイル参照キーは、特定のフォント ファイル参照を識別し、ファイルを読み込むフォント ファイル ローダー内で一意である必要があります。

IDWriteFontFileLoader

CreateCustomFontFileReference メソッドは、フォントの読み込みに使用されるアプリケーションによって実装された IDWriteFontFileLoader オブジェクトを受け取ります。 IDWriteFontFileLoader::CreateStreamFromKey コールバック メソッドがキーを渡され、IDWriteFontFileStream オブジェクトが出力されます。

IDWriteFontFileStream

アプリケーション実装 IDWriteFontFileStream オブジェクトは、カスタム フォント ファイル ローダーからのフォント ファイル参照のフォント ファイル データを提供します。 ファイル サイズと最後の書き込み時刻と共に、IDWriteFontFile オブジェクトにコンパイルされるファイル フラグメントを取得するためのメソッド (ReadFileFragment) を提供します。

注意

ReadFileFragment の実装では、要求されたフラグメントがファイルの境界外にある場合にエラーを返す必要があります。

 

IDWriteFontFileStream は、ローカル ハード ディスク ドライブや埋め込みリソースなど、どこからでもフォント ファイルの内容を取得できます。