Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A DWriteCore a Windows App SDKDirectWrite implementálása (a DirectWrite a DirectX API a kiváló minőségű szövegmegjelenítéshez, a felbontásfüggetlen szerkezeti betűtípusokhoz, valamint a Unicode teljes szöveg- és elrendezéstámogatásához). A DWriteCore a DirectWrite egy formája, amely a Windows több verzióján is működik egészen a Windows 10 1809-es (10.0; Build 17763) verziójáig. A DWriteCore ugyanazt az API-t implementálja, mint a DirectWrite, a jelen témakörben ismertetett néhány kiegészítéssel.
Ez a bevezető témakör bemutatja, hogy mi a DWriteCore, és bemutatja, hogyan telepítheti azt a fejlesztői környezetbe és programba.
A DirectWrite-et már használó alkalmazások esetében a DWriteCore-ra való váltás minimális módosításokat igényel:
- Adjon hozzá egy hivatkozást a Windows App SDK-csomaghoz.
-
dwrite_3.hhelyettdwrite_core.hbelefoglalása. -
DWriteCore.libcsatolásaDWrite.libhelyett. - A(z) DWriteCoreCreateFactory hívása DWriteCreateFactoryhelyett.
Cserébe az alkalmazás megkapja a Windows App SDK előnyeit– vagyis a legújabb API-khoz és funkciókhoz való hozzáférést, függetlenül attól, hogy az ügyfél milyen Windows-verziót futtat.
Borravaló
Az aktív fejlesztés alatt álló DirectX-összetevők leírását és hivatkozásait a DirectX kezdőlapcímű blogbejegyzésben találhatja meg.
A DWriteCore értékajánlata
DirectWrite számos olyan funkciót támogat, amelyek a legtöbb alkalmazáshoz a Windowsban választható betűtípus-megjelenítő eszközt teszik lehetővé – akár közvetlen hívásokon keresztül, akár Direct2Dkeresztül. A DirectWrite eszközfüggetlen szövegelrendezési rendszert, kiváló minőségű al képpontos Microsoft ClearType szövegmegjelenítést, hardveresen gyorsított szöveget, többformátumú szöveget, speciális OpenType® tipográfiai funkciókat, széles nyelvi támogatást és GDI-kompatibilis elrendezést és renderelést tartalmaz. A DirectWrite a Windows Vista SP2 óta érhető el, és az évek során egyre fejlettebb funkciókkal bővült, például a változó betűtípusokkal, amelyekkel stílusokat, súlyokat és egyéb attribútumokat alkalmazhat egyetlen betűtípus-erőforrással rendelkező betűtípusokra.
A DirectWrite hosszú élettartamának köszönhetően azonban a fejlesztés során a fejlesztések célja a Windows régebbi verzióinak hátrahagyása volt. Emellett a DirectWrite premier szövegmegjelenítési technológiája csak a Windowsra korlátozódik, így a platformfüggetlen alkalmazások saját szövegmegjelenítési vermet írhatnak, vagy külső megoldásokra támaszkodhatnak.
A DWriteCore a verziószolgáltatás árvaságával és platformfüggetlen kompatibilitásával kapcsolatos alapvető problémákat oldja meg a kódtár rendszerből való eltávolításával és az összes lehetséges támogatott végpont megcélzásával. Ennek érdekében integráltuk a DWriteCore-t a Windows App SDK-ba.
A DWriteCore elsődleges értéke, hogy fejlesztőként a Windows App SDK-ban számos (és végül az összes) DirectWrite-funkcióhoz biztosít hozzáférést. A DWriteCore minden funkciója ugyanúgy fog működni az összes alacsonyabb szintű verzióban, anélkül, hogy bármilyen eltérés lenne azzal kapcsolatban, hogy mely funkciók melyik verzión működnek.
A DWriteCore demo alkalmazás – DWriteCoreGallery
A DWriteCore-t a DWriteCoreGallery mintaalkalmazással mutatjuk be, amely most letölthető és tanulmányozható.
A DWriteCore használatának első lépései
A DWriteCore a Windows App SDKrésze. Ez a szakasz bemutatja, hogyan állíthatja be a fejlesztési környezetet a DWriteCore használatával való programozáshoz.
Eszközök telepítése a Windows App SDK-hoz
Lásd: Eszközök telepítése a Windows App SDK.
Új projekt létrehozása
A Visual Studióban hozzon létre egy új projektet a Blank App, Packaged (WinUI 3 in Desktop) projektsablonból. Ezt a projektsablont a nyelv kiválasztásával találja meg: C++; platform: Windows App SDK; projekttípus: Asztali.
További információ: WinUI 3projektsablonjai.
A Microsoft.ProjectReunion.DWrite NuGet-csomag telepítése
A Visual Studióban kattintson Project>NuGet-csomagok kezelése...>Tallózás, írja be vagy illessze be Microsoft.ProjectReunion.DWrite a keresőmezőbe, jelölje ki az elemet a keresési eredmények között, majd kattintson a telepítése gombra a projekt csomagjának telepítéséhez.
Másik lehetőségként kezdje a DWriteCoreGallery mintaalkalmazással
Alternatívaként a DWriteCore használatával is programozhat úgy, hogy a DWriteCoreGallery mintaalkalmazás-projektet választja kiindulópontnak, és a fejlesztést erre a projektre alapozza. Ezután nyugodtan eltávolíthat minden meglévő forráskódot (vagy fájlt) a mintaprojektből, és hozzáadhat minden új forráskódot (vagy fájlt) a projekthez.
DWriteCore használata a projektben
A DWriteCore-tal való programozásról a jelen témakör későbbi, DWriteCore szakaszában talál további információt.
A DWriteCore kiadási fázisai
A DirectWrite DWriteCore-ba történő portolása elég nagy projekt, amely több Windows kiadási ciklusra is kiterjed. Ez a projekt fázisokra van osztva, amelyek mindegyike egy kiadásban elérhető funkciókészletnek felel meg.
A DWriteCore aktuális kiadásának funkciói
A DWriteCore a Windows App SDKrésze. Ez tartalmazza azokat az alapvető eszközöket, amelyeket fejlesztőként a DWriteCore használatához kell használnia, beleértve az alábbi funkciókat is.
- Betűtípusok számbavétele.
- Font API.
- Formálás.
- Alacsony szintű renderelési API-k. Ez a jelenlegi szakaszban részleges – a DWriteCore nem működik együtt a Direct2D-nel, de lehetősége van használni a IDWriteGlyphRunAnalysis-t és a IDWriteBitmapRenderTarget-t.
- Egyszerű szövegelrendezési funkciók.
- Szövegmegjelenítő API-k.
- Bitkép renderelési cél.
- Színes betűtípusok.
- Egyéb optimalizálások (betűgyorsítótár-törlés, memóriabeli betűtípus-betöltő stb.).
- Az aláhúzás támogatása – lásd: IDWriteTextLayout::GetUnderline és IDWriteTextLayout::SetUnderline.
- Az áthúzás támogatása – lásd: IDWriteTextLayout::GetStrikethrough és IDWriteTextLayout::SetStrikethrough.
- Függőleges szöveg támogatása IDWriteTextLayouthasználatával – lásd: Függőleges szöveg.
- Az IDWriteTextAnalyzer és IDWriteTextAnalyzer1 interfészek összes metódusa implementálva van.
A szalagcím funkció a színes betűtípusok. A színes betűtípusok lehetővé teszik a betűtípusok kifinomultabb színfunkcióval való megjelenítését az egyszerű egyetlen színeken túl. Például a színes betűtípusok teszik lehetővé az emoji- és eszköztárikon betűtípusok megjelenítését (amelyek közül az utóbbit például az Office használja). A színes betűtípusokat először a Windows 8.1-ben vezették be, de a funkció jelentősen kibővült a Windows 10 1607-es verziójában (évfordulós frissítés).
A betűgyorsítótár és a memóriabeli betűtípus-betöltő megtisztítása lehetővé teszi a betűtípusok gyorsabb betöltését és a memóriafejlesztést.
Ezekkel a funkciókkal azonnal elkezdheti kihasználni a DirectWrite modern alapvető funkcióit, például a változó betűtípusokat. A változó betűtípusok a DirectWrite-ügyfelek egyik legfontosabb funkciója.
Meghívásunk az Ön számára mint DirectWrite fejlesztő
A DWriteCore és más Windows App SDK-összetevők a fejlesztői visszajelzések iránti nyitottsággal lesznek fejlesztve. Meghívjuk Önt arra, hogy kezdje el felfedezni a DWriteCore-t, és ossza meg észrevételeit vagy kérdéseit a Windows App SDK GitHub-adattárbana funkciók fejlesztésével kapcsolatban.
Programozás DWriteCore-tal
Csakúgy, mint DirectWrite, a DWriteCore-ot a COM-light API-n keresztül programozza az IDWriteFactory felületen keresztül.
A DWriteCore használatához hozzá kell adni a dwrite_core.h fejlécfájlt.
// pch.h
...
// DWriteCore header file.
#include <dwrite_core.h>
A dwrite_core.h fejlécfájl először definiálja a tokent DWRITE_CORE, majd tartalmazza a dwrite_3.h fejlécfájlt. A DWRITE_CORE jelző azért fontos, mert a később belefoglalt fejlécek úgy irányulnak, hogy az összes DirectWrite API elérhetővé váljon számára. Miután a projekt tartalmazza a dwrite_core.h-t, kódot írhat, fordíthatja és futtathatja.
Új vagy eltérő API-k a DWriteCore-hoz
A DWriteCore API felület nagyjából ugyanaz, mint DirectWrite. Van azonban néhány új API, amelyek jelenleg csak a DWriteCore-ban találhatók.
Gyári objektum létrehozása
A DWriteCoreCreateFactory szabad függvény létrehoz egy gyári objektumot, amelyet az egyes DWriteCore-objektumok későbbi létrehozásához használnak.
DWriteCoreCreateFactory funkcionálisan megegyezik a DirectWrite rendszerverziója által exportált DWriteCreateFactory függvénnyel. A DWriteCore függvény neve eltérő, így elkerülhető a kétértelműség.
Korlátozott gyári objektum létrehozása
A DWRITE_FACTORY_TYPE enumerálás új állandóval rendelkezik,DWRITE_FACTORY_TYPE_ISOLATED2, amely egy korlátozott gyárat jelez. A korlátozott gyárak zároltabbak, mint egy elszigetelt gyár. Semmilyen módon nem működik együtt a többfolyamatos és az állandó betűtípus-gyorsítótárral. Ezen kívül az ebből a gyárból visszaadott rendszerbetűkészlet csak jól ismert betűtípusokat tartalmaz. Így hozhat létre DWRITE_FACTORY_TYPE_ISOLATED2 korlátozott gyári objektumot a DWriteCoreCreateFactory ingyenes függvény meghívásakor.
// 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())
)
);
Ha a DirectWrite egy régebbi verziójának adja át DWRITE_FACTORY_TYPE_ISOLATED2, amely nem támogatja azt, akkor a DWriteCreateFactoryE_INVALIDARGértéket ad vissza.
Karakterjelek rajzolása rendszermemória-bitképre
A DirectWrite egy bittérképes renderelési célfelülettel rendelkezik, amely támogatja a karakterjelek bitképre való megjelenítését a rendszermemória egy bitképén. Jelenleg azonban az egyetlen módja annak, hogy hozzáférjenek a mögöttes képpontadatokhoz, ha a GDI-t használják, így az API nem használható platformfüggetlen. Ez könnyen orvosolható, ha hozzáad egy módszert a képpontadatok lekéréséhez.
Így a DWriteCore bevezeti az IDWriteBitmapRenderTarget2 felületet, és annak metódusát IDWriteBitmapRenderTarget2::GetBitmapData. Ez a metódus egy DWRITE_BITMAP_DATA_BGRA32típusú paramétert vesz fel, amely egy új struktúra.
Az alkalmazás az IDWriteGdiInterop::CreateBitmapRenderTarget meghívásával létrehoz egy bittérkép-renderelési célt. Windows rendszeren a bitkép-renderelési cél egy GDI-memória tartományvezérlőt foglal magában, amelybe egy GDI eszközfüggetlen bitkép (DIB) van kiválasztva. IDWriteBitmapRenderTarget::DrawGlyphRun glifákat renderel a DIB-re. A DirectWrite a GDI használata nélkül jeleníti meg a karakterjeleket. Az alkalmazás ekkor lekérheti a HDC- a bitkép renderelési célpontjáról, majd a BitBlt használatával átmásolhatja a képpontokat egy ablak HDC-ra.
Nem Windows-platformokon az alkalmazás továbbra is létrehozhat egy bitkép renderelési célt, de egyszerűen beágyaz egy rendszermemória-tömböt HDC- és DIB nélkül. HDC-nélkül az alkalmazásnak más módon kell lekérnie a bitkép képpontjait, hogy másolni tudja őket, vagy más módon használhassa őket. Még Windows rendszeren is néha hasznos a tényleges képpontadatok lekérése, és ennek jelenlegi módját az alábbi kód példájában mutatjuk be.
// 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);
}
Egyéb API-különbségek a DWriteCore és a DirectWrite között
Vannak olyan API-k, amelyek csak csonkok, vagy kissé eltérően viselkednek a nem Windows-platformokon. Például a IDWriteGdiInterop::CreateFontFaceFromHdc nem Windows-platformokon az E_NOTIMPL hibát adja vissza, mivel HDC nem létezik GDInélkül.
Végül pedig vannak bizonyos egyéb Windows API-k, amelyeket általában a DirectWrite-tal együtt használnak (a Direct2D egy figyelemre méltó példa). Jelenleg azonban a Direct2D és a DWriteCore nem működik együtt. Ha például létrehoz egy IDWriteTextLayout a DWriteCore használatával, és átadja azt a D2D1RenderTarget::DrawTextLayout, akkor a hívás nem fog sikerülni.