Raccolte di caratteri personalizzate (Windows 7/8)
DirectWrite consente di accedere alla raccolta di tipi di carattere di sistema usando il metodo IDWriteFactory::GetSystemFontCollection. Questa è la raccolta di tipi di carattere utilizzata più di frequente. Tuttavia, alcune applicazioni devono usare tipi di carattere non installati nel sistema, ad esempio da file di tipo di carattere inclusi o file di tipo di carattere incorporati nell'applicazione.
Se i tipi di carattere desiderati non si trovano nella raccolta di tipi di carattere di sistema, è possibile creare una raccolta di tipi di carattere personalizzata derivata da IDWriteFontCollection.
Questa panoramica è costituita dalle parti seguenti:
- La registrazione e l'annullamento della registrazione di un caricatore della raccolta di tipi di carattere
- IDWriteFontCollectionLoader
- IDWriteFontFileEnumerator
- CreateCustomFontFileReference
- IDWriteFontFileLoader
- IDWriteFontFileStream
Registrazione e annullamento della registrazione di un caricatore della raccolta di tipi di carattere
È possibile registrare un caricatore di raccolte di tipi di carattere usando il metodo IDWriteFactory::RegisterFontCollectionLoader e passandolo un IDWriteFontCollectionLoader interfaccia implementata dall'applicazione come oggetto singleton. Questo oggetto caricherà i tipi di carattere quando viene richiesta la raccolta personalizzata. Sia la raccolta di tipi di carattere di sistema che le raccolte di tipi di carattere personalizzati vengono memorizzate nella cache, quindi i tipi di carattere vengono caricati una sola volta.
Il caricatore della raccolta di caratteri deve essere scaricato alla fine usando il IDWriteFactory::UnregisterFontCollectionLoader.
Nota
La registrazione del caricatore della raccolta di caratteri aggiunge al conteggio dei riferimenti; non chiamare UnregisterFontCollectionLoader dall'interno del distruttore o l'oggetto caricatore di raccolta non verrà mai annullata la registrazione.
IDWriteFontCollectionLoader
Si crea un oggetto IDWriteFontFileEnumerator usando l'IDWriteFactory::CreateCustomFontCollection e passandola una chiave definita dall'applicazione. La chiave è un puntatore void e il tipo di dati, il formato e il significato sono definiti dall'applicazione e sono opachi per il sistema dei tipi di carattere.
Mentre la chiave può essere qualsiasi elemento, DirectWrite richiede che ogni chiave sia entrambe:
- Univoco per una raccolta di caratteri singola all'interno dell'ambito del caricatore.
- Valido fino a quando il caricatore non viene registrato usando la factory.
Quando viene chiamato il metodo CreateCustomFontCollection, DirectWrite richiama un'interfaccia IDWriteFontCollectionLoader implementata come oggetto singleton dall'applicazione. Il metodo di callback IDWriteFontCollectionLoader::CreateEnumeratorFromKey viene usato da DirectWrite per recuperare un IDWriteFontFileEnumerator oggetto implementato dall'applicazione. L'oggetto IDWriteFactory utilizzato per creare la raccolta viene passato a questo metodo e deve essere utilizzato dall'enumeratore di file di tipo carattere per creare gli oggetti IDWriteFontFile da includere nell'insieme.
La chiave passata a questo metodo identifica la raccolta di tipi di carattere e è la stessa chiave passata a CreateCustomFontCollection.
IDWriteFontFileEnumerator
L'oggetto IDWriteFontFileEnumerator definito dall'applicazione creato dal metodo CreateEnumeratorFromKey viene utilizzato per enumerare i file di tipo di carattere in un insieme, creando un oggetto IDWriteFontFile per ogni file. Il metodo IDWriteFontFileEnumerator::MoveNext modifica la posizione nel file di carattere successivo. Se è presente un file nella posizione, imposta il hasCurrentFile su TRUE. In caso contrario, verrà impostato su false e il metodo restituirà S_OK.
Nota
L'enumeratore di file di tipo carattere deve iniziare prima del primo elemento e avanzato alla prima chiamata a MoveNext.
Un oggettoIDWriteFontFileviene restituito dal metodo IDWriteFontFileEnumerator::GetCurrentFontFile. Se non è presente alcun file di tipo di carattere nella posizione corrente, perché MoveNext non è ancora stato chiamato o hasCurrentFile è stato impostato su FALSE, GetCurrentFontFile restituirà E_FAIL.
CreateCustomFontFileReference
È possibile creare l'output dell'oggetto IDWriteFontFileGetCurrentFont File chiamando IDWriteFactory::CreateCustomFontFileReference. La chiave di riferimento del file di carattere identifica un riferimento al file di carattere specifico e deve essere univoca all'interno del caricatore di file di tipo carattere che caricherà il file.
IDWriteFontFileLoader
Il metodoCreateCustomFontFileReferenceaccetta un oggetto IDWriteFontFileLoader implementato dall'applicazione utilizzata per caricare il tipo di carattere. Il metodo di callback IDWriteFontFileLoader::CreateStreamFromKey viene passato alla chiave e restituisce un oggetto IDWriteFontFileStream.
IDWriteFontFileStream
L'oggetto IDWriteFontFileStream implementato dall'applicazione fornisce i dati del file di tipo di carattere per un riferimento al file di tipo di carattere da un caricatore di file di tipo di carattere personalizzato. Insieme alle dimensioni del file e all'ora dell'ultima scrittura, fornisce un metodo (ReadFileFragment) per il recupero di frammenti di file da compilare in un oggetto IDWriteFontFile.
Nota
readFileFragment implementazioni devono restituire un errore se il frammento richiesto non rientra nei limiti del file.
Un IDWriteFontFileStream può ottenere il contenuto del file di tipo di carattere da qualsiasi posizione, ad esempio l'unità disco rigido locale o le risorse incorporate.