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.
DWriteCore is de Windows App SDK implementatie van DirectWrite (DirectWrite is de DirectX-API voor hoogwaardige tekstweergave, resolutieonafhankelijke overzichtslettertypen en volledige ondersteuning voor Unicode-tekst en indeling). DWriteCore is een vorm van DirectWrite die wordt uitgevoerd op versies van Windows naar Windows 10, versie 1809 (10.0; Build 17763). DWriteCore implementeert dezelfde API als DirectWrite, met enkele toevoegingen zoals beschreven in dit onderwerp.
In dit inleidende onderwerp wordt beschreven wat DWriteCore is en hoe u deze in uw ontwikkelomgeving en programma kunt installeren.
Voor een app die al Gebruikmaakt van DirectWrite, zijn minimale wijzigingen vereist voor het overschakelen naar DWriteCore:
- Voeg een verwijzing toe naar het Windows App SDK-pakket.
- Neem
dwrite_core.hop in plaats vandwrite_3.h. - Koppeling
DWriteCore.libin plaats vanDWrite.lib. - Roep DWriteCoreCreateFactory- aan in plaats van DWriteCreateFactory-.
In ruil daarvoor krijgt de app de voordelen van de Windows App SDK, namelijk toegang tot de nieuwste API's en functionaliteiten, ongeacht de versie van Windows die uw klant gebruikt.
Fooi
Zie het blogbericht DirectX-landingspaginavoor beschrijvingen van en koppelingen naar DirectX-onderdelen in actieve ontwikkeling.
De waardepropositie van DWriteCore
DirectWrite ondersteunt een uitgebreide reeks functies, waardoor het de voorkeurstool is voor lettertypeweergave in Windows voor de meeste apps—of dat nu via directe aanroepen is, of via Direct2D. DirectWrite omvat een apparaat-onafhankelijk tekstlay-outsysteem, hoogwaardige sub-pixel Microsoft ClearType-textrendering, hardware-versnelde tekst, tekst in meerdere indelingen, geavanceerde OpenType®-typografiefuncties, brede taalondersteuning en een lay-out en rendering die compatibel is met GDI. DirectWrite is beschikbaar sinds Windows Vista SP2 en is in de loop van de jaren ontwikkeld tot geavanceerdere functies zoals variabele lettertypen, waarmee u stijlen, gewichten en andere kenmerken kunt toepassen op een lettertype met slechts één lettertyperesource.
Vanwege de lange levensduur van DirectWrite hebben eerdere ontwikkelingen echter de neiging om oudere versies van Windows achter te laten. Bovendien is de status van DirectWrite als de premier text rendering-technologie alleen beperkt tot Windows, waardoor platformoverschrijdende toepassingen hun eigen tekstrenderingsstack kunnen schrijven of om te vertrouwen op oplossingen van derden.
DWriteCore lost de fundamentele problemen op van zwevende versiefuncties en platformoverschrijdende compatibiliteit door de bibliotheek uit het systeem te verwijderen en alle mogelijke ondersteunde eindpunten te richten. Daarom hebben we DWriteCore geïntegreerd in Windows App SDK.
De primaire waarde die DWriteCore u als ontwikkelaar in Windows App SDK biedt, is dat deze toegang biedt tot veel (en uiteindelijk alle) DirectWrite-functies. Alle functies van DWriteCore werken op dezelfde manier op alle downlevel versies zonder enige verschillen met betrekking tot welke functies kunnen werken op welke versies.
De DWriteCore-demo-app – DWriteCoreGallery
DWriteCore wordt gedemonstreerd via de DWriteCoreGallery voorbeeld-app, die u nu kunt downloaden en bestuderen.
Aan de slag met DWriteCore
DWriteCore maakt deel uit van de Windows App SDK-. In deze sectie wordt beschreven hoe u uw ontwikkelomgeving instelt voor programmeren met DWriteCore.
Hulpprogramma's installeren voor de Windows App SDK
Zie Hulpprogramma's installeren voor de Windows App SDK-.
Een nieuw project maken
Maak in Visual Studio een nieuw project op basis van de Blank App, Packaged (WinUI 3 in Desktop) projectsjabloon. U kunt die projectsjabloon vinden door de taal te kiezen: C++; platform: Windows App SDK; projecttype: Desktop.
Zie Project-sjablonen voor WinUI 3voor meer informatie.
Het NuGet-pakket Microsoft.ProjectReunion.DWrite installeren
Klik in Visual Studio op Project>NuGet-pakketten beheren...>Bladeren, typ of plak Microsoft.ProjectReunion.DWrite- in het zoekvak, selecteer het item in de zoekresultaten en klik vervolgens op Installeren om het pakket voor dat project te installeren.
U kunt ook beginnen met de voorbeeld-app DWriteCoreGallery
U kunt ook programmeren met DWriteCore door te beginnen met het DWriteCoreGallery voorbeeld-app-project en uw ontwikkeling op dat project te baseren. U kunt vervolgens alle bestaande broncode (of bestanden) uit dat voorbeeldproject verwijderen en nieuwe broncode (of bestanden) toevoegen aan het project.
DWriteCore gebruiken in uw project
Zie de sectie Programmeren met DWriteCore verderop in dit onderwerp voor meer informatie over programmeren met DWriteCore.
De releasefasen van DWriteCore
DirectWrite overzetten naar DWriteCore is een voldoende groot project voor meerdere Windows-releasecycli. Dat project is onderverdeeld in fasen, die elk overeenkomt met een segment van de functionaliteit die in een release wordt geleverd.
Functies in de huidige release van DWriteCore
DWriteCore maakt deel uit van de Windows App SDK-. Het bevat de basishulpprogramma's die u als ontwikkelaar nodig hebt om DWriteCore te gebruiken, met inbegrip van de volgende functies.
- Lettertypen opsommen
- Lettertype-API.
- Vormgeving.
- Rendering-API's op laag niveau. Dit is gedeeltelijk in de huidige fase: DWriteCore werkt niet samen met Direct2D-, maar u kunt IDWriteGlyphRunAnalysis- en IDWriteBitmapRenderTargetgebruiken.
- Basisfunctionaliteit voor tekstindeling.
- API's voor tekstweergave.
- Bitmapweergavedoel.
- Kleurlettertypen.
- Diverse optimalisaties (lettertypecache opschonen, in-memory lettertypelaadprogramma, enzovoort).
- Ondersteuning voor onderstrepen: zie IDWriteTextLayout::GetUnderline en IDWriteTextLayout::SetUnderline.
- Ondersteuning voor doorstreepjefunctie—zie IDWriteTextLayout::GetStrikethrough en IDWriteTextLayout::SetStrikethrough.
- Ondersteuning voor verticale tekst via IDWriteTextLayout-: zie verticale tekst.
- Alle methoden van de IDWriteTextAnalyzer- en IDWriteTextAnalyzer1 interfaces worden geïmplementeerd.
Een bannerfunctie is kleurenlettertypen. Met kleurenlettertypen kunt u uw lettertypen weergeven met geavanceerdere kleurfunctionaliteit dan eenvoudige afzonderlijke kleuren. Met kleurenlettertypen kunnen bijvoorbeeld emoji- en pictogramlettertypen worden weergegeven (waarvan de laatste bijvoorbeeld door Office wordt gebruikt). Kleurenlettertypen zijn voor het eerst geïntroduceerd in Windows 8.1, maar de functie is sterk uitgebreid in Windows 10, versie 1607 (Jubileumupdate).
Het werk voor het opschonen van de lettertypecache en het in-memory lettertypelaadprogramma maken sneller laden van lettertypen en geheugenverbeteringen mogelijk.
Met deze functies kunt u direct een aantal moderne kernfunctionaliteit van DirectWrite gebruiken, zoals variabele lettertypen. Variabele lettertypen zijn een van de belangrijkste functies voor DirectWrite-klanten.
Onze uitnodiging voor u als DirectWrite-ontwikkelaar
DWriteCore, samen met andere Windows App SDK-onderdelen, wordt ontwikkeld met openheid voor feedback van ontwikkelaars. We nodigen u uit om DWriteCore te verkennen en om inzicht te geven in of aanvragen voor functieontwikkeling in onze GitHub-opslagplaats voor Windows App SDK.
Programmeren met DWriteCore
Net als bij DirectWriteprogrammat u met DWriteCore via de COM-light-API, via de IDWriteFactory interface.
Als u DWriteCore wilt gebruiken, moet u het dwrite_core.h headerbestand opnemen.
// pch.h
...
// DWriteCore header file.
#include <dwrite_core.h>
Het dwrite_core.h headerbestand definieert eerst het token DWRITE_COREen bevat vervolgens het dwrite_3.h headerbestand. Het DWRITE_CORE-token is belangrijk, omdat het ervoor zorgt dat alle daarna opgenomen headers alle DirectWrite API's beschikbaar maken. Zodra uw project dwrite_core.hheeft opgenomen, kunt u vervolgens code schrijven, bouwen en uitvoeren.
API's die nieuw of verschillend zijn voor DWriteCore
Het DWriteCore-API-oppervlak is grotendeels hetzelfde als voor DirectWrite-. Maar er zijn momenteel slechts een klein aantal nieuwe API's in DWriteCore.
Een factory-object maken
De DWriteCoreCreateFactory vrije functie maakt een fabrieksobject dat wordt gebruikt voor het creëren van afzonderlijke DWriteCore-objecten.
DWriteCoreCreateFactory- is functioneel hetzelfde als de DWriteCreateFactory- functie die wordt geëxporteerd door de systeemversie van DirectWrite. De functie DWriteCore heeft een andere naam om dubbelzinnigheid te voorkomen.
Een beperkt factory-object maken
De opsomming DWRITE_FACTORY_TYPE heeft een nieuwe constante,DWRITE_FACTORY_TYPE_ISOLATED2, die een beperkte fabriek aangeeft. Een beveiligde fabriek is meer afgesloten dan een geïsoleerde fabriek. Het werkt op geen enkele manier met een procesoverschrijdende of permanente lettertypecache. Daarnaast bevat de systeemlettertypeverzameling die is geretourneerd uit deze fabriek alleen bekende lettertypen. U kunt DWRITE_FACTORY_TYPE_ISOLATED2 als volgt gebruiken om een beperkt factory-object te maken wanneer u de DWriteCoreCreateFactory gratis functie aanroept.
// Create a factory that doesn't interact with any cross-process nor
// persistent cache state.
winrt::com_ptr<::IDWriteFactory7> spFactory;
winrt::check_hresult(
::DWriteCoreCreateFactory(
DWRITE_FACTORY_TYPE_ISOLATED2,
__uuidof(spFactory),
reinterpret_cast<IUnknown**>(spFactory.put())
)
);
Als u DWRITE_FACTORY_TYPE_ISOLATED2 doorgeeft aan een oudere versie van DirectWrite die dit niet ondersteunt, retourneert DWriteCreateFactory-E_INVALIDARG.
Glyphs tekenen op een geheugen bitmap van het systeem
DirectWrite heeft een bitmapweergavedoelinterface die ondersteuning biedt voor het weergeven van glyphs naar een bitmap in het systeemgeheugen. Momenteel is echter de enige manier om toegang te krijgen tot de onderliggende pixelgegevens door GDI te gaan, en dus is de API niet bruikbaar op meerdere platforms. Dit wordt eenvoudig opgelost door een methode toe te voegen om de pixelgegevens op te halen.
DWriteCore introduceert de IDWriteBitmapRenderTarget2 interface en de methode IDWriteBitmapRenderTarget2::GetBitmapData. Deze methode gebruikt een parameter van het type (aanwijzer naar) DWRITE_BITMAP_DATA_BGRA32, een nieuwe struct.
Uw toepassing maakt een bitmapweergavedoel door IDWriteGdiInterop::CreateBitmapRenderTargetaan te roepen. In Windows encapsuleert een bitmap-rendertarget een GDI-geheugen-DC met een daarin geselecteerde GDI-apparaatonafhankelijke bitmap (DIB). IDWriteBitmapRenderTarget::DrawGlyphRun geeft glyphs weer aan de DIB. DirectWrite geeft de glyphs zichzelf weer zonder GDI te doorlopen. Uw toepassing kan vervolgens de HDC- ophalen uit het bitmapweergavedoel en BitBlt- gebruiken om de pixels te kopiëren naar een venster HDC-.
Op niet-Windows-platforms kan uw toepassing nog steeds een bitmapweergavedoel maken, maar het bevat gewoon een systeemgeheugenmatrix zonder HDC- en geen DIB. Zonder een HDC-moet er een andere manier zijn voor uw toepassing om de bitmap pixels op te halen, zodat deze kunnen worden gekopieerd of op een andere manier kunnen worden gebruikt. Zelfs in Windows is het soms handig om de werkelijke pixelgegevens op te halen, en we laten de huidige manier zien om dit te doen in het onderstaande codevoorbeeld.
// pch.h
#pragma once
#include <windows.h>
#include <Unknwn.h>
#include <winrt/Windows.Foundation.h>
// WinMain.cpp
#include "pch.h"
#include <dwrite_core.h>
#pragma comment(lib, "Gdi32")
class TextRenderer
{
DWRITE_BITMAP_DATA_BGRA32 m_targetBitmapData;
public:
void InitializeBitmapData(winrt::com_ptr<IDWriteBitmapRenderTarget> const& renderTarget)
{
// Query the bitmap render target for the new interface.
winrt::com_ptr<IDWriteBitmapRenderTarget2> renderTarget2;
renderTarget2 = renderTarget.try_as<IDWriteBitmapRenderTarget2>();
if (renderTarget2)
{
// IDWriteBitmapRenderTarget2 exists, so we can get the bitmap the easy way.
winrt::check_hresult(renderTarget2->GetBitmapData(OUT & m_targetBitmapData));
}
else
{
// We're using an older version that doesn't implement IDWriteBitmapRenderTarget2,
// so we have to get the bitmap by going through GDI. First get the bitmap handle.
HDC hdc = renderTarget->GetMemoryDC();
winrt::handle dibHandle{ GetCurrentObject(hdc, OBJ_BITMAP) };
winrt::check_bool(bool{ dibHandle });
// Call a GDI function to fill in the DIBSECTION structure for the bitmap.
DIBSECTION dib;
winrt::check_bool(GetObject(dibHandle.get(), sizeof(dib), &dib));
m_targetBitmapData.width = dib.dsBm.bmWidth;
m_targetBitmapData.height = dib.dsBm.bmHeight;
m_targetBitmapData.pixels = static_cast<uint32_t*>(dib.dsBm.bmBits);
}
}
};
int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
{
TextRenderer textRenderer;
winrt::com_ptr<IDWriteBitmapRenderTarget> renderTarget{ /* ... */ };
textRenderer.InitializeBitmapData(renderTarget);
}
Andere API-verschillen tussen DWriteCore en DirectWrite
Er zijn een paar API's die alleen stubs zijn of die zich enigszins anders gedragen op niet-Windows-platforms. Bijvoorbeeld, IDWriteGdiInterop::CreateFontFaceFromHdc geeft E_NOTIMPL terug op niet-Windows-systemen, aangezien er op niet-Windows-systemen geen HDC zonder GDIis.
En ten slotte zijn er bepaalde andere Windows-API's die doorgaans samen met DirectWrite worden gebruikt (Direct2D is een opmerkelijk voorbeeld). Momenteel werken Direct2D en DWriteCore echter niet samen. Als u bijvoorbeeld een IDWriteTextLayout maakt met DWriteCore en deze doorgeeft aan D2D1RenderTarget::DrawTextLayout, mislukt die aanroep.