Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp worden verschillende manieren beschreven waarop u aangepaste lettertypen in uw app kunt gebruiken.
- Inleiding
- samenvatting van API's
- belangrijke concepten
- lettertypen en lettertypebestandsindelingen
- lettertypesets en lettertypeverzamelingen
-
veelvoorkomende scenario's
- Een lettertypeset maken met behulp van willekeurige lettertypen in het lokale bestandssysteem
- Een lettertypeset maken met behulp van bekende lettertypen in het lokale bestandssysteem
- Een aangepaste lettertypeset maken met behulp van bekende, externe lettertypen op het web
- Een aangepaste lettertypeset maken met behulp van lettertypegegevens die in het geheugen zijn geladen
- Geavanceerde scenario's
Introductie
Meestal gebruiken apps de lettertypen die lokaal op het systeem zijn geïnstalleerd. DirectWrite biedt toegang tot deze lettertypen met behulp van de methoden IDWriteFactory3::GetSystemFontSet of IDWriteFactory::GetSystemFontCollection methoden. In sommige gevallen willen apps mogelijk ook lettertypen gebruiken die zijn opgenomen als onderdeel van Windows 10, maar die momenteel niet op het huidige systeem zijn geïnstalleerd. Dergelijke lettertypen kunnen worden geopend vanuit de Windows-lettertypeservice met behulp van de methode GetSystemFontSet of door IDWriteFactory3::GetSystemFontCollection met includeDownloadableFonts ingesteld op TRUE aan te roepen.
In sommige toepassingsscenario's moeten apps echter lettertypen gebruiken die niet in het systeem zijn geïnstalleerd en die niet worden geleverd door de Windows Font Service. Hier volgen voorbeelden van dergelijke scenario's:
- Lettertypen worden ingesloten als resources in een binair app-bestand.
- Lettertypebestanden worden gebundeld in een app-pakket en opgeslagen op schijf onder de installatiemap van de app.
- De app is een hulpprogramma voor lettertypeontwikkeling dat door de gebruiker opgegeven lettertypebestanden moet laden.
- Lettertypen worden ingesloten in documentbestanden die kunnen worden bekeken of bewerkt in de app.
- De app maakt gebruik van lettertypen die zijn verkregen uit een openbare weblettertypeservice.
- De app maakt gebruik van lettertypegegevens die via een privénetwerkprotocol worden gestreamd.
DirectWrite biedt API's voor het werken met aangepaste lettertypen in deze en andere vergelijkbare scenario's. De aangepaste lettertypegegevens kunnen afkomstig zijn van bestanden in het lokale bestandssysteem; van externe, cloudbronnen die toegankelijk zijn via HTTP; of van willekeurige bronnen nadat deze in een geheugenbuffer zijn geladen.
Notitie
Hoewel DirectWrite API's heeft geleverd voor het werken met aangepaste lettertypen sinds Windows 7, zijn nieuwere API's toegevoegd in Windows 10 en opnieuw in de Windows 10-makersupdate (preview build 15021 of hoger) die het eenvoudiger maken om verschillende van de genoemde scenario's te implementeren. Dit onderwerp is gericht op API's die beschikbaar zijn in Window 10. Zie Aangepaste lettertypeverzamelingen (Windows 7/8)voor toepassingen die moeten werken met eerdere Windows-versies.
Samenvatting van API's
Dit onderwerp is gericht op de functionaliteit van de volgende API's:
- interface idWriteFontSet
- INTERFACE IDWriteFontSetBuild er
- IDWriteFontSetBuilder1 interface
- interface idWriteFontFaceRe ference
- interface idWriteFontFile
- methode IDWriteFactory::CreateFontFileRe ference
- methode IDWriteFactory::CreateCustomFontFileReference
- IDWriteFactory3::CreateFontFaceReference methoden
- DWRITE_FONT_PROPERTY structuur
- opsomming DWRITE_FONT_PROPERTY_ID
- idWriteFontFileLoader interface
- methode IDWriteFactory::RegisterFontFileLoader
- methode IDWriteFactory::UnregisterFontFileLoader
- methode IDWriteFactory5::CreateInMemoryFontFileLoader
- IDWriteInMemoryFontFileLoader interface
- methode IDWriteFactory5::CreateHttpFontFileLoader
- IDWriteRemoteFontFileLoader interface
- IDWriteFontDownloadQueue interface
- idWriteFontDownloadListener interface
- interface idWriteFontFileStream
- interface idWriteRemoteFontFileStream
- interface idWriteAsyncResult
- methode IDWriteFactory5::AnalyzeContainerType
- methode IDWriteFactory5::UnpackFontFile
Sleutelbegrippen
Om inzicht te hebben in de DirectWrite-API's voor het werken met aangepaste lettertypen, kan het handig zijn om inzicht te hebben in het conceptuele model dat ten grondslag aan deze API's is gekoppeld. Hier worden de belangrijkste concepten beschreven.
Wanneer DirectWrite de werkelijke tekstindeling of -weergave doet, moet deze toegang hebben tot de werkelijke lettertypegegevens. Een lettertype-faceobject bevat werkelijke lettertypegegevens, die moeten bestaan in het lokale systeem. Maar voor andere bewerkingen, zoals het controleren van de beschikbaarheid van een bepaald lettertype of het presenteren van lettertypen aan een gebruiker, is alles wat nodig is een verwijzing naar een bepaald lettertype, niet naar de werkelijke lettertypegegevens zelf. In DirectWrite bevat een lettertype-object met gezichtsverwijzing alleen de informatie die nodig is om een lettertype te zoeken en te instantiëren. Omdat de lettertype-gezichtsverwijzing geen werkelijke gegevens bevat, kan DirectWrite omgaan met lettertype-gezichtsverwijzingen waarvoor werkelijke gegevens zich op een externe netwerklocatie bevinden en wanneer de werkelijke gegevens lokaal zijn.
Een lettertypeset is een reeks lettertypegezichtverwijzingen, samen met bepaalde basiseigenschappen, informatieve eigenschappen die kunnen worden gebruikt om te verwijzen naar het lettertype of om het te vergelijken met andere lettertypen, zoals de familienaam of een waarde voor lettertypegewicht. De werkelijke gegevens voor de verschillende lettertypen kunnen lokaal zijn, of het kan allemaal extern zijn of een combinatie ervan.
Een lettertypeset kan worden gebruikt om een bijbehorend lettertypeverzamelingsobject te verkrijgen. Zie Hieronder lettertypesets en lettertypeverzamelingen voor meer informatie.
De interface IDWriteFontSet biedt methoden waarmee query's kunnen worden uitgevoerd op eigenschapswaarden, zoals familienaam of lettertypegewicht, of voor lettertypegezichtverwijzingen die overeenkomen met bepaalde eigenschapswaarden. Nadat u hebt gefilterd op een bepaalde selectie, kan een exemplaar van de IDWriteFontFaceReference interface worden verkregen, met methoden voor het downloaden (als de werkelijke lettertypegegevens momenteel extern zijn), voor het verkrijgen van de bijbehorende IDWriteFontFace3 object dat kan worden gebruikt voor indeling en rendering.
De interface IDWriteFontFile onderbouwt elk lettertype of lettertype face-verwijzing. Dit vertegenwoordigt de locatie van een lettertypebestand en heeft twee onderdelen: een lettertypebestandslaadprogramma en een lettertypebestandssleutel. Het lettertypebestandslaadprogramma (IDWriteFontFileLoader) wordt gebruikt om een bestand indien nodig te openen en retourneert een stroom met de gegevens (IDWriteFontFileStream). Afhankelijk van het laadprogramma bevinden de gegevens zich mogelijk op een lokaal bestandspad, een externe URL of in een geheugenbuffer. De sleutel is een door het laadprogramma gedefinieerde waarde die het bestand uniek identificeert binnen de context van het laadprogramma, zodat het laadprogramma de gegevens kan vinden en er een stroom voor kan maken.
Aangepaste lettertypen kunnen eenvoudig worden toegevoegd aan een aangepaste lettertypeset, die op zijn beurt kan worden gebruikt voor het filteren of ordenen van lettertype-informatie voor doeleinden zoals het maken van een gebruikersinterface voor lettertypekiezer. De lettertypeset kan ook worden gebruikt om een lettertypeverzameling te maken voor gebruik in API's op een hoger niveau, zoals IDWriteTextFormat en IDWriteTextLayout. De IDWriteFontSetBuilder interface kan worden gebruikt voor het maken van een aangepaste lettertypeset met verschillende aangepaste lettertypen. Het kan ook worden gebruikt om een aangepaste lettertypeset te maken die aangepaste lettertypen en door het systeem geleverde lettertypen combineert; of dat lettertypen combineert met verschillende bronnen voor de werkelijke gegevens: lokale opslag, externe URL's en geheugen.
Zoals vermeld, kan een lettertype-faceverwijzing verwijzen naar lettertypegegevens in een externe bron, maar de gegevens moeten lokaal zijn om een lettertype-gezichtsobject te verkrijgen dat kan worden gebruikt voor indeling en rendering. Het downloaden van externe gegevens wordt verwerkt door een downloadwachtrij voor lettertypen. Apps kunnen de IDWriteFontDownloadQueue interface gebruiken om aanvragen voor het downloaden van externe lettertypen in de wachtrij te zetten om het downloadproces te starten en om een IDWriteFontDownloadListener-object te registreren om actie te ondernemen wanneer het downloadproces is voltooid.
Voor de meeste interfaces die hier worden beschreven, biedt DirectWrite systeem-implementaties. De enige uitzondering is de IDWriteFontDownloadListener interface, die een app implementeert om app-specifieke acties uit te voeren wanneer externe lettertypen lokaal zijn gedownload. Apps kunnen reden hebben om hun eigen aangepaste implementaties te bieden voor bepaalde andere interfaces, maar dat zou alleen nodig zijn in specifieke, geavanceerdere scenario's. Een app moet bijvoorbeeld een aangepaste implementatie bieden van de IDWriteFontFileLoader interface voor het verwerken van lettertypebestanden in lokale opslag die gebruikmaken van de WOFF2-containerindeling. Hieronder vindt u aanvullende informatie.
Lettertypen en lettertypebestandsindelingen
Een ander belangrijk concept dat handig is om te begrijpen, is de relatie tussen afzonderlijke lettertype-gezichten en lettertypebestanden die deze bevatten. Het idee van een OpenType-lettertypebestand (.ttf of .otf) dat één lettertype bevat, is bekend. Maar de OpenType-lettertypeindeling biedt ook een OpenType-lettertypeverzameling (.ttc of .otc), een enkel bestand dat meerdere lettertypen bevat. OpenType Collection-bestanden worden vaak gebruikt voor grote lettertypen die nauw verwant zijn en identieke waarden hebben voor bepaalde lettertypegegevens: door de lettertypen in één bestand te combineren, kunnen de algemene gegevens worden ontdupliceerd. Daarom moet een lettertype- of lettertype-faceverwijzing niet alleen verwijzen naar een lettertypebestand (of een equivalente gegevensbron), maar moet er ook een lettertypeindex in dat bestand worden opgegeven, voor het algemene geval waarin het bestand een verzamelingsbestand kan zijn.
Voor lettertypen die op het web worden gebruikt, worden lettertypegegevens vaak verpakt in bepaalde containerindelingen, WOFF of WOFF2, die enige compressie van de lettertypegegevens bieden en een zekere mate van bescherming tegen piraterij en schending van lettertypelicenties. Functioneel is een WOFF- of WOFF2-bestand gelijk aan een OpenType-lettertype- of Lettertypeverzamelingsbestand, maar de gegevens worden gecodeerd in een andere indeling die moet worden uitgepakt voordat het kan worden gebruikt.
Bepaalde DirectWrite-API's kunnen te maken hebben met afzonderlijke lettertype gezichten, terwijl andere API's bestanden kunnen verwerken die mogelijk OpenType Collection-bestanden bevatten die meerdere gezichten bevatten. Op dezelfde manier verwerken bepaalde API's alleen onbewerkte, OpenType-indelingsgegevens, terwijl andere API's de verpakte, WOFF- en WOFF2-containerindelingen kunnen verwerken. Deze details vindt u in de onderstaande discussie.
Lettertypesets en lettertypeverzamelingen
Sommige toepassingen kunnen worden geïmplementeerd om met lettertypen te werken met behulp van de interface IDWriteFontCollection. Er is een directe correspondentie tussen een lettertypeverzameling en een lettertypeset. Elk kan dezelfde lettertypen bevatten, maar ze presenteren ze met een andere organisatie. Vanuit elke lettertypeverzameling kan een bijbehorende lettertypeset worden verkregen en omgekeerd.
Wanneer u met een aantal aangepaste lettertypen werkt, kunt u het eenvoudigst een opbouwinterface voor lettertypesets gebruiken om een aangepaste lettertypeset te maken en vervolgens een lettertypeverzameling verkrijgen nadat de lettertypeset is gemaakt. Hieronder wordt het proces voor het maken van een aangepaste lettertypeset beschreven. Voor het verkrijgen van een IDWriteFontCollection1 interface uit een lettertypeset, wordt de methode IDWriteFactory3::CreateFontCollectionFromFontSet methode gebruikt.
Als de app een verzamelingsobject heeft en een bijbehorende lettertypeset moet verkrijgen, kunt u dit doen met behulp van de methode IDWriteFontCollection1::GetFontSet.
Algemene scenario's
In deze sectie worden enkele van de meest voorkomende scenario's beschreven met betrekking tot aangepaste lettertypesets:
- Een aangepaste lettertypeset maken met behulp van willekeurige lettertypen op paden in het lokale bestandssysteem.
- Een aangepaste lettertypeset maken met behulp van bekende lettertypen (mogelijk gebundeld met de app) die zijn opgeslagen in het lokale bestandssysteem.
- Een aangepaste lettertypeset maken met behulp van bekende, externe lettertypen op internet.
- Een aangepaste lettertypeset maken met behulp van lettertypegegevens die in het geheugen zijn geladen.
Volledige implementaties voor deze scenario's worden gegeven in het voorbeeld van aangepaste lettertypesets voor DirectWrite. Dit voorbeeld illustreert ook een meer geavanceerd scenario voor het verwerken van lettertypegegevens die zijn verpakt in WOFF- of WOFF2-containerindelingen, die hieronder worden besproken.
Een lettertypeset maken met behulp van willekeurige lettertypen in het lokale bestandssysteem
Wanneer u te maken hebt met een willekeurige set lettertypebestanden in lokale opslag, is de methode IDWriteFontSetBuilder1::AddFontFile methode handig omdat in één aanroep alle lettertypegezichten in een OpenType-bestand voor lettertypeverzameling en alle exemplaren voor een OpenType-variabelelettertype kunnen worden verwerkt. Dit is beschikbaar in de Windows 10-makersupdate (preview-versie 15021 of hoger) en wordt aanbevolen wanneer deze beschikbaar is.
Als u deze methode wilt gebruiken, gebruikt u het volgende proces.
- 1. Begin met het maken van de interface IDWriteFactory5:
- Maak voor elk lettertypebestand in het lokale bestandssysteem een IDWriteFontFile- die ernaar verwijst:
- Nadat alle bestanden zijn toegevoegd aan de opbouwfunctie voor lettertypesets, kan de aangepaste lettertypeset worden gemaakt:
IDWriteFactory5* pDWriteFactory;
HRESULT hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory5),
reinterpret_cast<IUnknown**>(&pDWriteFactory)
);
2. Gebruik de fabriek om de IDWriteFontSetBuilder1 interface te verkrijgen:
IDWriteFontSetBuilder1* pFontSetBuilder;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateFontSetBuilder(&pFontSetBuilder);
}
IDWriteFontFile* pFontFile;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateFontFileReference(pFilePath, /* lastWriteTime*/ nullptr, &pFontFile);
}
4. Voeg de IDWriteFontFile--object toe aan de opbouwfunctie voor lettertypesets met behulp van de methode AddFontFile:
hr = pFontSetBuilder->AddFontFile(pFontFile);
Als het bestandspad dat is opgegeven in de aanroep naar CreateFontFileReference naar iets anders verwezen dan een ondersteund OpenType-bestand, retourneert de aanroep naar AddFontFile een fout, DWRITE_E_FILEFORMAT.
IDWriteFontSet* pFontSet;
hr = pFontSetBuilder->CreateFontSet(&pFontSet);
Als de app moet worden uitgevoerd op Windows 10-versies ouder dan de Windows 10 Creators Update, is de methode AddFontFile niet beschikbaar. Beschikbaarheid kan worden gedetecteerd door een IDWriteFactory3 interface te maken en vervolgens queryinterface te gebruiken om een idWriteFactory5-interface-interface te verkrijgen: als dit lukt, is de IDWriteFontSetBuilder1 interface en AddFontFile-methode ook beschikbaar.
Als de methode AddFontFile niet beschikbaar is, moet de methode IDWriteFontSetBuilder::AddFontFaceReference methode worden gebruikt om afzonderlijke lettertypevlakken toe te voegen. Als u OpenType Font Collection-bestanden wilt toestaan die meerdere gezichten bevatten, kan de methode IDWriteFontFile::Analyze worden gebruikt om het aantal gezichten in het bestand te bepalen. Het proces is als volgt.
- 1. Begin met het maken van de IDWriteFactory3 interface:
- Gebruik de factory om de IDWriteFontSetBuilder interface te verkrijgen:
- Maak voor elk lettertypebestand een IDWriteFontFile, zoals hierboven:
- Nadat alle gezichten zijn toegevoegd aan de opbouwfunctie voor lettertypesets, maakt u de aangepaste lettertypeset, zoals hierboven wordt weergegeven.
IDWriteFactory3* pDWriteFactory;
HRESULT hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory5),
reinterpret_cast<IUnknown**>(&pDWriteFactory)
);
IDWriteFontSetBuilder* pFontSetBuilder;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateFontSetBuilder(&pFontSetBuilder);
}
IDWriteFontFile* pFontFile;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateFontFileReference(pFilePath, /* lastWriteTime*/ nullptr, &pFontFile);
}
In plaats van het bestand rechtstreeks toe te voegen aan de opbouwfunctie voor lettertypesets, moeten we het aantal gezichten bepalen en afzonderlijke IDWriteFontFaceReference-objecten maken.
4. Gebruik de methode Analyze om het aantal gezichten in het bestand op te halen.
BOOL isSupported;
DWRITE_FONT_FILE_TYPE fileType;
UINT32 numberOfFonts;
hr = pFontFile->Analyze(&isSupported, &fileType, /* face type */ nullptr, &numberOfFonts);
De methode Analyze stelt ook waarden in voor de parameters isSupported en fileType. Als het bestand geen ondersteunde indeling is, isSupported ONWAAR en kan de juiste actie, zoals het negeren van het bestand, worden uitgevoerd.
5. Loop over het aantal lettertypen dat is ingesteld in de parameter numberOfFonts. Maak in de lus een IDWriteFontFaceReference voor elk bestand/indexpaar en voeg dit toe aan de opbouwfunctie voor lettertypesets.
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);
}
}
Een app kan zo worden ontworpen dat deze de voorkeursmethode AddFontFile gebruikt wanneer deze wordt uitgevoerd op de Windows 10 Creators Update, maar u kunt terugvallen om de AddFontFaceReference methode te gebruiken wanneer deze wordt uitgevoerd in eerdere Versies van Windows 10. Test op beschikbaarheid van de interface IDWriteFactory5, zoals hierboven beschreven, en vertakking dienovereenkomstig. Deze benadering wordt geïllustreerd in het voorbeeld van aangepaste lettertypesets voor DirectWrite.
Een lettertypeset maken met behulp van bekende lettertypen in het lokale bestandssysteem
Zoals hierboven vermeld, wordt elk lettertype face-verwijzing in een lettertypeset gekoppeld aan bepaalde informatieve eigenschappen, zoals familienaam en lettertypegewicht. Wanneer aangepaste lettertypen worden toegevoegd aan een opbouwfunctie voor lettertypensets met behulp van de hierboven vermelde API-aanroepen, worden deze informatieve eigenschappen rechtstreeks verkregen uit de werkelijke lettertypegegevens, die worden gelezen wanneer het lettertype wordt toegevoegd. In sommige situaties, als een app echter een andere bron van informatie over een lettertype heeft, kan het zijn dat deze eigen aangepaste waarden voor deze eigenschappen wil opgeven.
Stel dat een app een aantal lettertypen bundelt die worden gebruikt voor het presenteren van bepaalde elementen van de gebruikersinterface in de app. Soms, zoals bij een nieuwe app-versie, moeten de specifieke lettertypen die de app gebruikt voor deze elementen mogelijk wijzigen. Als de app verwijzingen naar de specifieke lettertypen heeft, moet u elk van deze verwijzingen wijzigen door het ene lettertype te vervangen door een ander lettertype. Als de app in plaats daarvan aangepaste eigenschappen gebruikt om functionele aliassen toe te wijzen op basis van het type element of de weergegeven tekst, wijst u elke alias op één plaats toe aan een specifiek lettertype en gebruikt u vervolgens de aliassen in alle contexten waarin lettertypen worden gemaakt en bewerkt. Als u het ene lettertype vervangt door een ander lettertype, hoeft u alleen de ene plaats te wijzigen waar de alias is toegewezen aan een specifiek lettertype.
Aangepaste waarden voor informatieve eigenschappen kunnen worden toegewezen wanneer de methode IDWriteFontSetBuilder::AddFontFaceReference methode wordt aangeroepen. De methode hiervoor is als volgt; dit kan worden gebruikt voor elke Windows 10-versie.
Zoals hierboven wordt weergegeven, begint u met het verkrijgen van de IDWriteFactory3- en IDWriteFontSet interfaces. Maak een IDWriteFontFaceReference, zoals hierboven wordt weergegeven. Voordat dit wordt toegevoegd aan de opbouwfunctie voor lettertypesets (binnen de lus in stap 5, hierboven weergegeven), definieert de app echter de aangepaste eigenschapswaarden die moeten worden gebruikt.
Een set aangepaste eigenschapswaarden wordt gedefinieerd met behulp van een matrix van DWRITE_FONT_PROPERTY structuren. Elk van deze eigenschappen identificeert een bepaalde eigenschap uit de DWRITE_FONT_PROPERTY_ID enum en de bijbehorende eigenschapswaarde die moet worden gebruikt.
Houd er rekening mee dat alle eigenschapswaarden worden toegewezen als tekenreeksen. Als deze later aan gebruikers kunnen worden weergegeven, kunnen alternatieve waarden voor een bepaalde eigenschap voor verschillende talen worden ingesteld, maar dit is niet vereist. Houd er ook rekening mee dat als aangepaste eigenschapswaarden door de app worden ingesteld, alleen de opgegeven waarden worden gebruikt in de lettertypeset; DirectWrite leidt geen waarden rechtstreeks af van het lettertype voor informatieve eigenschappen die in een lettertypeset worden gebruikt.
In het volgende voorbeeld worden aangepaste waarden gedefinieerd voor drie informatieve eigenschappen: familienaam, volledige naam en tekengewicht.
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 }
};
Nadat u de gewenste matrix met eigenschapswaarden voor een lettertype hebt gedefinieerd, roept u AddFontFaceRefence aan, waarbij de eigenschapmatrix en de verwijzing naar het lettertype worden doorgegeven.
hr = pFontSetBuilder->AddFontFaceReference(pFontFaceReference, props, ARRAYSIZE(props));
Zodra alle aangepaste lettertypegezichten zijn toegevoegd aan de opbouwfunctie voor lettertypesets, samen met hun aangepaste eigenschappen, maakt u de aangepaste lettertypeset, zoals hierboven wordt weergegeven.
Een aangepaste lettertypeset maken met bekende, externe lettertypen op internet
Aangepaste eigenschappen zijn belangrijk voor het werken met externe lettertypen. Elk lettertype moet een aantal informatieve eigenschappen hebben om het lettertype te karakteriseren en het te onderscheiden van andere lettertypen. Omdat de lettertypegegevens voor externe lettertypen niet lokaal zijn, kan DirectWrite geen eigenschappen rechtstreeks afleiden uit de lettertypegegevens. Daarom moeten eigenschappen expliciet worden opgegeven bij het toevoegen van een extern lettertype aan de opbouwfunctie voor lettertypesets.
De reeks API-aanroepen voor het toevoegen van externe lettertypen aan een lettertypeset is vergelijkbaar met de volgorde die voor het vorige scenario wordt beschreven. Omdat de lettertypegegevens extern zijn, zijn de bewerkingen voor het lezen van de werkelijke lettertypegegevens echter anders dan bij het werken met bestanden in de lokale opslag. Voor deze situatie is er een nieuwe interface op lager niveau, IDWriteRemoteFontFileLoader, toegevoegd in de Windows 10 Creators Update.
Als u het externe lettertypebestandslaadprogramma wilt gebruiken, moet deze eerst worden geregistreerd bij een DirectWrite-fabriek. Het laadprogramma moet door de app worden bewaard zolang de lettertypen die eraan zijn gekoppeld, worden gebruikt. Zodra de lettertypen niet meer in gebruik zijn en op een bepaald moment voordat de fabriek wordt vernietigd, moet de registratie van het laadprogramma ongedaan worden gemaakt. Dit kan worden gedaan in de destructor voor de klasse die eigenaar is van het laadprogrammaobject. Deze stappen worden hieronder weergegeven.
De methode voor het maken van een aangepaste lettertypeset met externe lettertypen is als volgt; Hiervoor is de Windows 10-makersupdate vereist.
- 1. Maak een IDWriteFactory5-interface, zoals hierboven wordt weergegeven.
2. Maak een IDWriteFontSetBuilder interface, zoals hierboven wordt weergegeven.
3. Gebruik de fabriek om een IDWriteRemoteFontFileLoaderte verkrijgen.
- Definieer aangepaste eigenschappen voor het lettertype, zoals hierboven wordt weergegeven.
- Voeg de lettertype-face-verwijzing samen met aangepaste eigenschappen toe aan de opbouwfunctie voor lettertypesets, zoals hierboven wordt weergegeven.
- Nadat alle lettertypen zijn toegevoegd aan de opbouwfunctie voor lettertypesets, maakt u de lettertypeset, zoals hierboven wordt weergegeven.
- Op een bepaald moment waarop de externe lettertypen niet meer worden gebruikt, moet u de registratie van het externe lettertypebestandslaadprogramma ongedaan maken.
IDWriteRemoteFontFileLoader* pRemoteFontFileLoader;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateHttpFontFileLoader(
/* referrerURL */ nullptr,
/* extraHeaders */ nullptr,
&pRemoteFontFileLoader
);
}
Dit retourneert een door het systeem geleverde implementatie van de interface voor het externe lettertypebestandslaadprogramma dat HTTP-interacties kan verwerken voor het downloaden van lettertypegegevens namens de app. Een verwijzings-URL of extra headers kunnen worden opgegeven indien vereist door de lettertypeservice of -services die de bron voor de lettertypen zijn.
Belangrijk
Opmerking over de beveiliging: wanneer een poging wordt gedaan om een extern lettertype op te halen, bestaat het potentieel voor een aanvaller om de beoogde server te spoofen die wordt aangeroepen. In dat geval worden de doel- en verwijzings-URL's en headergegevens openbaar gemaakt aan de aanvaller. App-ontwikkelaars zijn verantwoordelijk voor het beperken van dit risico. Het gebruik van het HTTPS-protocol in plaats van HTTP wordt aanbevolen.
Eén extern lettertypebestandslaadprogramma kan worden gebruikt voor meerdere lettertypen, hoewel verschillende laadfuncties kunnen worden gebruikt als lettertypen worden verkregen van meerdere services die verschillende vereisten hebben voor de URL van de verwijzing of extra headers.
4. Registreer het externe lettertypebestandslaadprogramma bij de fabriek.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->RegisterFontFileLoader(pRemoteFontFileLoader);
}
Vanaf dit moment zijn de stappen voor het maken van de aangepaste lettertypeset vergelijkbaar met de stappen die worden beschreven voor bekende, lokale lettertypebestanden, met twee belangrijke uitzonderingen. Eerst wordt het IDWriteFontFile--object gemaakt met behulp van de interface voor het externe lettertypebestandslaadprogramma in plaats van de factory te gebruiken. Ten tweede kan de analysemethode niet worden gebruikt omdat de lettertypegegevens niet lokaal zijn. In plaats daarvan moet de app weten of het externe lettertypebestand een OpenType-lettertypeverzamelingsbestand is. Als dat het zo is, moet de app weten welke lettertypen in de verzameling het zal gebruiken en de index voor elk bestand. Daarom zijn de resterende stappen als volgt.
5. Voor elk extern lettertypebestand gebruikt u de interface voor het externe lettertypebestandslaadprogramma om een IDWriteFontFilete maken, waarbij u de URL opgeeft die is vereist voor toegang tot het lettertypebestand.
IDWriteFontFile* pFontFile;
hr = pRemoteFontFileLoader->CreateFontFileReferenceFromUrl(
pDWriteFactory,
/* baseUrl */ L"https://github.com/",
/* fontFileUrl */ L"winjs/winjs/blob/master/src/fonts/Symbols.ttf?raw=true",
&pFontFile
);
Houd er rekening mee dat de volledige URL kan worden opgegeven in de parameter fontFileUrl of kan worden gesplitst in basis- en relatieve delen. Als er een basis-URL is opgegeven, moeten de samenvoeging van de waarden baseUrl en fontFileUrl de volledige URL opgeven. DirectWrite levert geen extra scheidingstekens op.
Belangrijk
Opmerking over beveiliging/prestaties: Wanneer een poging wordt gedaan om een extern lettertype op te halen, is er geen garantie dat Windows een reactie van de server ontvangt. In sommige gevallen reageert een server mogelijk met een bestand niet-gevonden fout voor een ongeldige relatieve URL, maar reageert niet meer als er meerdere ongeldige aanvragen worden ontvangen. Als de server niet reageert, treedt er uiteindelijk een time-out op, maar dit kan enkele minuten duren als er meerdere ophalen worden gestart. U moet doen wat u kunt doen om ervoor te zorgen dat URL's geldig zijn wanneer er oproepen worden gedaan.
Houd er ook rekening mee dat de URL kan verwijzen naar een onbewerkt OpenType-lettertypebestand (.ttf, .otf, .ttc, .otc), maar het kan ook verwijzen naar lettertypen in een WOFF- of WOFF2-containerbestand. Als naar een WOFF- of WOFF2-bestand wordt verwezen, worden de lettertypegegevens automatisch uitgepakt door de DirectWrite-implementatie van het externe lettertypebestandslaadprogramma.
6. Maak een IDWriteFontFaceReferencevoor elke lettertype-gezichtsindex in het externe lettertypebestand dat moet worden gebruikt.
IDWriteFontFaceReference* pFontFaceReference;
hr = pDWriteFactory->CreateFontFaceReference(pFontFile, /* faceIndex */ 0, DWRITE_FONT_SIMULATIONS_NONE, &pFontFaceReference);
hr = pDWriteFactory->UnregisterFontFileLoader(pRemoteFontFileLoader);
Zodra een aangepaste lettertypeset met aangepaste externe lettertypen is gemaakt, bevat de lettertypeset verwijzingen en informatieve eigenschappen voor de externe lettertypen, maar de werkelijke gegevens zijn nog steeds op afstand. Met DirectWrite-ondersteuning voor externe lettertypen kan een lettertypegezicht worden bijgehouden in de lettertypeset en voor een lettertype dat moet worden geselecteerd voor gebruik in de indeling en weergave, maar dat de werkelijke gegevens pas worden gedownload als er een werkelijke noodzaak is om deze te gebruiken, zoals wanneer de tekstindeling wordt uitgevoerd.
Een app kan vooraf aan de slag gaan door directWrite de lettertypegegevens te downloaden en vervolgens te wachten op bevestiging van een geslaagde download voordat een verwerking met het lettertype wordt gestart. Maar een netwerkdownload impliceert enige latentie van onvoorspelbare duur en succes is ook onzeker. Daarom is het meestal beter om een andere benadering te kiezen, zodat indeling en rendering in eerste instantie kunnen worden uitgevoerd met alternatieve lettertypen of terugvallettertypen die al lokaal zijn, terwijl het downloaden van het gewenste, externe lettertype parallel wordt aangevraagd en vervolgens de resultaten worden bijgewerkt zodra het gewenste lettertype is gedownload.
Als u wilt aanvragen dat het hele lettertype wordt gedownload voordat het wordt gebruikt, kan de methode IDWriteFontFaceReference::EnqueueFontDownloadRequest methode worden gebruikt. Als het lettertype erg groot is, is mogelijk slechts een deel van de gegevens nodig voor het verwerken van bepaalde tekenreeksen. DirectWrite biedt aanvullende methoden die kunnen worden gebruikt voor het aanvragen van gedeelten van de lettertypegegevens die nodig zijn voor bepaalde inhoud, EnqueueCharacterDownloadRequest en EnqueueGlyphDownloadRequest.
Stel dat de aanpak die in de app moet worden gebruikt, is dat de verwerking in eerste instantie kan worden uitgevoerd met behulp van lokale, alternatieve of terugvallettertypen. De IDWriteFontFallback::MapCharacters methode kan worden gebruikt om lokale terugvallettertypen te identificeren en er wordt ook automatisch een aanvraag weergegeven om het voorkeurslettertype te downloaden. Als IDWriteTextLayout- wordt gebruikt en sommige of alle tekst in de indeling is opgemaakt met behulp van een externe lettertypereferentie, gebruikt DirectWrite automatisch de MapCharacters methode om lokale terugvallettertypen op te halen en een aanvraag in de wachtrij te plaatsen om de externe lettertypegegevens te downloaden.
DirectWrite onderhoudt een wachtrij voor het downloaden van lettertypen voor elke fabriek en de aanvragen die zijn gedaan met behulp van de hierboven genoemde methoden, worden toegevoegd aan die wachtrij. De wachtrij voor het downloaden van lettertypen kan worden verkregen met behulp van de methode IDWriteFactory3::GetFontDownloadQueue.
Als er een downloadaanvraag wordt gedaan, maar de lettertypegegevens al lokaal zijn, resulteert dit in een no-op: er wordt niets toegevoegd aan de downloadwachtrij. Een app kan controleren of de wachtrij leeg is of dat er downloadaanvragen in behandeling zijn door de methode IDWriteFontDownloadQueue::IsEmpty aan te roepen.
Nadat aanvragen voor externe lettertypen zijn toegevoegd aan de wachtrij, moet het downloadproces worden gestart. Wanneer externe lettertypen worden gebruikt in IDWriteTextLayout, wordt het downloaden automatisch gestart wanneer de app IDWriteTextLayout methoden aanroept die indelings- of renderingbewerkingen afdwingen, zoals getLineMetrics of tekenmethoden. In andere scenario's moet de app het downloaden rechtstreeks starten door IDWriteFontDownloadQueue::BeginDownloadaan te roepen.
Wanneer een download is voltooid, is het aan de app om de juiste acties uit te voeren: door te gaan met bewerkingen die in behandeling zijn of herhalende bewerkingen die in eerste instantie zijn uitgevoerd met terugvallettertypen. (Als de tekstindeling van DirectWrite wordt gebruikt, kan IDWriteTextLayout3::InvalidateLayout worden gebruikt om de tijdelijke resultaten te wissen die zijn berekend met behulp van terugvallettertypen.) De app moet een implementatie van de idWriteFontDownloadListener interface bieden en deze doorgeven aan de aanroep BeginDownload om de app op de hoogte te stellen wanneer het downloadproces is voltooid en om de juiste acties uit te voeren.
Belangrijk
Opmerking over beveiliging/prestaties: Wanneer een poging wordt gedaan om een extern lettertype op te halen, is er geen garantie dat Windows een reactie van de server ontvangt. Als de server niet reageert, treedt er uiteindelijk een time-out op, maar dit kan enkele minuten duren als meerdere externe lettertypen worden opgehaald, maar mislukken. De aanroep BeginDownload keert onmiddellijk terug. Apps mogen de gebruikersinterface niet blokkeren terwijl wordt gewacht tot IDWriteFontDownloadListener::D ownloadCompleted moet worden aangeroepen.
Voorbeeld-implementaties van deze interacties met de lettertypedownloadwachtrij van DirectWrite en van de IDWriteFontDownloadListener-interface interface zijn te zien in de Voorbeeld van aangepaste lettertypesets voor DirectWrite, en ook in het voorbeeld van DirectWrite Downloadbare lettertypen.
Een aangepaste lettertypeset maken met behulp van lettertypegegevens die in het geheugen zijn geladen
Net zoals de bewerkingen op laag niveau voor het lezen van gegevens uit een lettertypebestand verschillen voor bestanden op een lokale schijf versus externe bestanden op internet, geldt hetzelfde ook voor lettertypegegevens die in een geheugenbuffer zijn geladen. Er is een nieuwe interface op laag niveau toegevoegd voor het verwerken van lettertypegegevens in het geheugen in de Windows 10 Creators Update, IDWriteInMemoryFontFileLoader.
Net als bij een extern lettertypebestandslaadprogramma moet een in-memory lettertypebestandslaadprogramma eerst worden geregistreerd bij een DirectWrite-fabriek. Het laadprogramma moet door de app worden bewaard zolang de lettertypen die eraan zijn gekoppeld, worden gebruikt. Zodra de lettertypen niet meer in gebruik zijn en op een bepaald moment voordat de fabriek wordt vernietigd, moet de registratie van het laadprogramma ongedaan worden gemaakt. Dit kan worden gedaan in de destructor voor de klasse die eigenaar is van het laadprogrammaobject. Deze stappen worden hieronder weergegeven.
Als de app afzonderlijke informatie bevat over de lettertypegezichten die door de gegevens worden vertegenwoordigd, kan de app afzonderlijke lettertypegezichtverwijzingen toevoegen aan een opbouwfunctie voor lettertypensets met aangepaste eigenschappen die zijn opgegeven. Omdat de lettertypegegevens zich in het lokale geheugen bevinden, is dit echter niet vereist; DirectWrite kan de gegevens rechtstreeks lezen om de eigenschapswaarden af te leiden.
DirectWrite gaat ervan uit dat de lettertypegegevens onbewerkt zijn, OpenType-indeling, gelijk aan een OpenType-bestand (.ttf, .otf, .ttc, .otc), maar in het geheugen in plaats van op schijf. De gegevens kunnen geen WOFF- of WOFF2-containerindeling hebben. De gegevens kunnen een OpenType-lettertypeverzameling vertegenwoordigen. Als er geen aangepaste eigenschappen worden gebruikt, kan de methode IDWriteFontSetBuilder1::AddFontFile methode worden gebruikt om alle lettertypegezichten in de gegevens in één aanroep toe te voegen.
Een belangrijke overweging voor het scenario in het geheugen is de levensduur van de gegevens. Als een aanwijzer naar de buffer wordt doorgegeven aan DirectWrite zonder duidelijke aanwijzing dat er een eigenaar is, maakt DirectWrite een kopie van de gegevens in een nieuwe geheugenbuffer waarvan deze eigenaar is. Om te voorkomen dat gegevens en extra geheugentoewijzing worden gekopieerd, kan de app een gegevenseigenaarobject doorgeven dat IUnknown implementeert en die eigenaar is van de geheugenbuffer die de lettertypegegevens bevat. Door deze interface te implementeren, kan DirectWrite toevoegen aan het aantal refs van het object, waardoor de levensduur van de gegevens in eigendom wordt gegarandeerd.
De methode voor het maken van een aangepaste lettertypeset met behulp van in-memory lettertypegegevens is als volgt; Hiervoor is de Windows 10-makersupdate vereist. Hierbij wordt ervan uitgegaan dat een door de app geïmplementeerd gegevenseigenaarobject wordt geïmplementeerd, dat IUnknown implementeert en ook methoden heeft waarmee een aanwijzer wordt geretourneerd naar de geheugenbuffer en de grootte van de buffer.
- 1. Maak een IDWriteFactory5-interface, zoals hierboven wordt weergegeven.
2. Maak een interface [**IDWriteFontSetBuilder1**](/windows/win32/api/dwrite_3/nn-dwrite_3-idwritefontsetbuilder1), zoals hierboven wordt weergegeven.
3. Gebruik de fabriek om een IDWriteInMemoryFontFileLoader te verkrijgen.
IDWriteInMemoryFontFileLoader* pInMemoryFontFileLoader;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateInMemoryFontFileLoader(&pInMemoryFontFileLoader);
}
Hiermee wordt een door het systeem geleverde implementatie van de interface voor het in-memory lettertypebestandslaadprogramma geretourneerd.
4. Registreer het in-memory lettertypebestandslaadprogramma bij de fabriek.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->RegisterFontFileLoader(pInMemoryFontFileLoader);
}
5. Gebruik voor elk in-memory lettertypebestand het laadprogramma voor lettertypebestanden in het geheugen om een IDWriteFontFilete maken.
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. Voeg het object IDWriteFontFile toe aan de opbouwfunctie voor lettertypesets met behulp van de methode AddFontFile, zoals hierboven wordt weergegeven. Als er behoefte is, kan de app in plaats daarvan afzonderlijke IDWriteFontFaceReference objecten maken op basis van de IDWriteFontFile, eventueel aangepaste eigenschappen definiëren voor elke lettertype-gezichtsreferentie en vervolgens de lettertype-gezichtsreferentie met aangepaste eigenschappen toevoegen aan de lettertypeset met behulp van de methode AddFontFaceReference methode, zoals hierboven wordt weergegeven.
7. Nadat alle lettertypen zijn toegevoegd aan de opbouwfunctie voor lettertypesets, maakt u de aangepaste lettertypeset, zoals hierboven wordt weergegeven.
8. Op een bepaald moment waarop de lettertypen in het geheugen niet meer worden gebruikt, moet u de registratie van het in-memory lettertypebestandslaadprogramma ongedaan maken.
hr = pDWriteFactory->UnregisterFontFileLoader(pInMemoryFontFileLoader);
Geavanceerde scenario's
Sommige apps hebben mogelijk speciale vereisten waarvoor geavanceerdere verwerking is vereist dan hierboven wordt beschreven.
Lettertypesets combineren
Sommige apps moeten mogelijk een lettertypeset maken die bestaat uit een combinatie van items uit andere lettertypesets. Een app kan bijvoorbeeld een lettertypeset maken waarin alle lettertypen die op het systeem zijn geïnstalleerd, worden gecombineerd met een selectie van aangepaste lettertypen of waarin geïnstalleerde lettertypen worden gecombineerd die voldoen aan bepaalde criteria met andere lettertypen. DirectWrite bevat API's ter ondersteuning van manipulatie en combinatie van lettertypesets.
Als u twee of meer lettertypesets wilt combineren, worden met de methode IDWriteFontSetBuilder::AddFontSet methode alle lettertypen in de opgegeven lettertypeset toegevoegd aan een opbouwfunctie voor lettertypesets in één aanroep. Als alleen bepaalde lettertypen uit een bestaande lettertypeset zijn vereist in de nieuwe lettertypeset, kan de methode IDWriteFontSet::GetMatchingFonts methode worden gebruikt om een nieuw lettertypesetobject af te leiden dat is gefilterd om alleen lettertypen op te nemen die overeenkomen met de opgegeven eigenschappen. Deze methoden bieden een eenvoudige manier om een aangepaste lettertypeset te maken waarin lettertypen uit twee of meer bestaande lettertypesets worden gecombineerd
Lokale WOFF- of WOFF2-lettertypegegevens gebruiken
Als een app lettertypebestanden in het lokale bestandssysteem of in een geheugenbuffer heeft, maar de indelingen van de WOFF- of WOFF2-container gebruikt, biedt DirectWrite (Windows 10 Creator Update of hoger) een methode voor het uitpakken van de containerindeling, IDWriteFactory5::UnpackFontFile, waarmee een IDWriteFontFileStreamwordt geretourneerd.
De app heeft echter een manier nodig om de IDWriteFontFileStream- op te halen in een lettertypebestandslaadobject. Een manier om dit te doen, is door een aangepaste IDWriteFontFileLoader te maken implementatie die de stroom verpakt. Net als bij andere lettertypebestandslazers moet dit worden geregistreerd voor gebruik en moet de registratie ongedaan worden gemaakt voordat de factory buiten het bereik valt.
Als de aangepaste loader ook wordt gebruikt met onbewerkte (niet verpakte) lettertypebestanden, moet de app ook een aangepaste implementatie van de IDWriteFontFileStream interface bieden voor het verwerken van deze bestanden. Er zijn echter eenvoudiger manieren om API's te gebruiken die hierboven worden besproken voor het verwerken van onbewerkte lettertypebestanden. De noodzaak voor een aangepaste stream-implementatie kan worden vermeden door afzonderlijke codepaden te gebruiken voor verpakte lettertypebestanden versus onbewerkte lettertypebestanden.
Nadat een aangepast lettertypebestandslaadprogrammaobject is gemaakt, worden de gegevens van het ingepakte lettertypebestand op app-specifieke manieren toegevoegd aan het laadprogramma. Het laadprogramma kan meerdere lettertypebestanden verwerken, die elk worden geïdentificeerd met behulp van een door de app gedefinieerde sleutel die ondoorzichtig is voor DirectWrite. Nadat een ingepakt lettertypebestand is toegevoegd aan het laadprogramma, wordt de methode IDWriteFactory::CreateCustomFontFileReference methode gebruikt om een IDWriteFontFile te verkrijgen op basis van dat laadprogramma voor de lettertypegegevens die zijn geïdentificeerd door een bepaalde sleutel.
Het daadwerkelijk uitpakken van de lettertypegegevens kan worden uitgevoerd als lettertypen worden toegevoegd aan het laadprogramma, maar kan ook worden verwerkt in de methode IDWriteFontFileLoader::CreateStreamFromKey methode, die DirectWrite aanroept wanneer de lettertypegegevens voor het eerst moeten worden gelezen.
Nadat een IDWriteFontFile-object is gemaakt, worden de resterende stappen voor het toevoegen van de lettertypen aan een aangepaste lettertypeset zoals hierboven beschreven.
Een implementatie die deze methode gebruikt, wordt geïllustreerd in het voorbeeld van aangepaste lettertypesets van DirectWrite.
DirecteWrite-mechanismen voor extern lettertype gebruiken met aangepaste netwerk implementatie op laag niveau
De DirectWrite-mechanismen voor het verwerken van externe lettertypen kunnen worden onderverdeeld in mechanismen op een hoger niveau, met lettertypesets die lettertypegezichtverwijzingen bevatten voor externe lettertypen, de lokaliteit van de lettertypegegevens controleren en de wachtrij voor downloadaanvragen voor lettertypen beheren, en de mechanismen op lager niveau die de werkelijke download verwerken. Sommige apps willen mogelijk gebruikmaken van de mechanismen voor externe lettertypen op een hoger niveau, maar vereisen ook aangepaste netwerkinteracties, zoals het communiceren met servers met andere protocollen dan HTTP.
Voor deze situatie moet een app een aangepaste implementatie maken van de IDWriteRemoteFontFileLoader interface die op de vereiste manieren communiceert met andere interfaces op lager niveau. De app moet ook aangepaste implementaties bieden van deze interfaces op lager niveau: IDWriteRemoteFontFileStreamen IDWriteAsyncResult. Deze drie interfaces hebben callback-methoden die DirectWrite zal aanroepen tijdens downloadbewerkingen.
Wanneer IDWriteFontDownloadQueue::BeginDownload wordt aangeroepen, maakt DirectWrite query's naar het externe lettertypebestandslaadprogramma over de lokaliteit van de gegevens en vraagt de externe stream aan. Als gegevens niet lokaal zijn, worden de BeginDownload-methode van de stream aangeroepen. De stream-implementatie mag deze aanroep niet blokkeren, maar moet onmiddellijk worden geretourneerd, waarbij een IDWriteAsyncResult-object wordt doorgegeven dat de wachtgreep DirectWrite biedt, wordt gebruikt om te wachten op de asynchrone downloadbewerking. De aangepaste stream-implementatie is verantwoordelijk voor het afhandelen van de externe communicatie. Wanneer de voltooiingsgebeurtenis is opgetreden, roept DirectWrite IDWriteAsyncResult::GetResult aan om het resultaat van de bewerking te bepalen. Als het resultaat is geslaagd, wordt verwacht dat volgende ReadFragment-aanroepen naar de stream voor de gedownloade bereiken slaagt.
Belangrijk
Opmerking over beveiliging/prestaties: wanneer een poging wordt gedaan om een extern lettertype op te halen, bestaat het potentieel in het algemeen voor een aanvaller om de beoogde server die wordt aangeroepen te spoofen of dat de server mogelijk niet reageert. Als u aangepaste netwerkinteracties implementeert, hebt u mogelijk meer controle over oplossingen dan bij het omgaan met servers van derden. Het is echter aan u om passende oplossingen te overwegen om openbaarmaking van informatie of Denial of Service te voorkomen. Beveiligde protocollen, zoals HTTPS, worden aanbevolen. U moet ook een time-out maken, zodat de gebeurtenis-handle die wordt geretourneerd naar DirectWrite uiteindelijk wordt ingesteld.
Ondersteunende scenario's in eerdere Windows-versies
De scenario's die zijn beschreven, kunnen worden ondersteund in DirectWrite in eerdere versies van Windows, maar vereisen veel meer aangepaste implementatie in het deel van de app met behulp van de beperktere API's die beschikbaar waren vóór Windows 10. Zie Aangepaste lettertypeverzamelingen (Windows 7/8)voor meer informatie.