共用方式為


Windows 7/8 (自訂字型集合)

DirectWrite使用IDWriteFactory::GetSystemFontCollection方法來存取系統字型集合。 這是最常使用的字型集合。 不過,某些應用程式必須使用未安裝在系統上的字型,例如從應用程式中內嵌的字型檔案或字型檔案。

如果您想要的字型不在系統字型集合中,您可以建立衍生自 IDWriteFontCollection的自訂字型集合。

此概觀包含下列部分:

註冊和取消註冊字型集合載入器

您可以使用 IDWriteFactory::RegisterFontCollectionLoader 方法註冊字型集合載入器,並將應用程式實作的 IDWriteFontCollectionLoader 介面傳遞為單一物件。 此物件會在要求自訂集合時載入字型。 系統會快取系統字型集合和自訂字型集合,因此只會載入字型一次。

最終必須使用 IDWriteFactory::UnregisterFontCollectionLoader卸載字型集合載入器。

注意

註冊字型集合載入器會將 新增至參考計數;請勿從解構函式內呼叫 UnregisterFontCollectionLoader ,否則永遠不會取消註冊集合載入器物件。

 

IDWriteFontCollectionLoader

您可以使用IDWriteFactory::CreateCustomFontCollection來建立IDWriteFontFileEnumerator物件,並傳遞應用程式定義的金鑰。 索引鍵是 void 指標,而且資料類型、格式和意義是由應用程式所定義,而且不透明于字型系統。

而索引鍵可以是任何專案,DirectWrite要求每個索引鍵都是:

  • 在載入器的範圍內,單一字型集合是唯一的。
  • 有效,直到使用 Factory 取消註冊載入器為止。

呼叫CreateCustomFontCollection方法時,DirectWrite呼叫回應用程式實作為單一物件的IDWriteFontCollectionLoader介面。 DirectWrite會使用IDWriteFontCollectionLoader::CreateEnumeratorFromKey回呼方法來擷取應用程式所實作的IDWriteFontFileEnumerator物件。 用來建立集合的 IDWriteFactory 物件會傳遞至這個方法,而且應該由字型檔案列舉值用來建立要包含在集合中的 IDWriteFontFile 物件。

傳遞至這個方法的索引鍵會識別字型集合,而且是傳遞至 CreateCustomFontCollection的相同索引鍵。

IDWriteFontFileEnumerator

由 CreateEnumeratorFromKey方法建立的應用程式定義IDWriteFontFileEnumerator物件可用來列舉集合中的字型檔案,為每個檔案建立IDWriteFontFile物件。 IDWriteFontFileEnumerator::MoveNext方法會將位置變更為下一個字型檔案。 如果位置有檔案,則會將 hasCurrentFile 設定為 TRUE。 否則,它會設定為 FALSE ,而且方法會傳回 S_OK

注意

字型檔案列舉值必須在第一個元素之前開始,並在第一次呼叫 MoveNext時進階。

 

IDWriteFontFile物件是由IDWriteFontFileEnumerator::GetCurrentFontFile方法輸出。 如果目前位置沒有字型檔案,因為 MoveNext 尚未呼叫或 hasCurrentFile 設定為 FALSE,則 GetCurrentFontFile 會傳回 E_FAIL

CreateCustomFontFileReference

GetCurrentFontFileIDWriteFontFile物件輸出可以藉由呼叫IDWriteFactory::CreateCustomFontFileReference來建立。 字型檔案參考索引鍵會識別特定的字型檔案參考,而且在將載入檔案的字型檔案載入器內必須是唯一的。

IDWriteFontFileLoader

CreateCustomFontFileReference方法會採用用來載入字型的應用程式所實作的IDWriteFontFileLoader物件。 IDWriteFontFileLoader::CreateStreamFromKey回呼方法會傳遞金鑰並輸出IDWriteFontFileStream物件。

IDWriteFontFileStream

應用程式實作的 IDWriteFontFileStream 物件會從自訂字型檔案載入器提供字型檔案參考的字型檔案資料。 它與檔案大小和上次寫入時間一起提供方法 (ReadFileFragment) ,以擷取要編譯成 IDWriteFontFile 物件的檔案片段。

注意

如果要求的片段超出檔案界限,ReadFileFragment 實作應該會傳回錯誤。

 

IDWriteFontFileStream可以從任何地方取得字型檔案內容,例如本機硬碟或內嵌資源。