DirectWrite renderelése
Megjelenítési beállítások
Egy formázású szöveg, amelyet csak egy IDWriteTextFormat objektum ír le, meg lehet jeleníteni a Direct2Dsegítségével, azonban az IDWriteTextLayout objektum megjelenítésére több lehetőség is van.
Az IDWriteTextLayout objektum által leírt sztring az alábbi módszerekkel jeleníthető meg.
1. Renderelés Direct2D használatával
Az IDWriteTextLayout objektum megjelenítéséhez Direct2D használatával használja az ID2D1RenderTarget::DrawTextLayout metódust, ahogyan az az alábbi kódban látható.
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
A "IDWriteTextLayout" objektum Direct2D használatával történő megrajzolásának részletes megértéséhez tekintse meg az "A DirectWritehasználatának első lépései" című témakört.
2. Renderelés egyéni szöveg renderelővel.
Egyéni renderelővel renderelhet az IDWriteTextLayout::D raw metódussal, amely az IDWriteTextRenderer-ből származó visszahívási felületet vesz fel argumentumként, ahogyan az az alábbi kódban látható.
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
Az IDWriteTextLayout::Draw metódus meghívja a megadott egyéni renderelő visszahívási metódusait. A DrawGlyphRun, DrawUnderline, DrawInlineObjectés DrawStrikethrough metódusok végzik a rajzfeladatokat.
IDWriteTextRenderer deklarálja a glyph-futtatás, aláhúzás, áthúzás és beágyazott objektumok rajzolási módszereit. Ezeknek a módszereknek az implementálása az alkalmazáson múlik. Egyéni szövegmegjelenítő létrehozása lehetővé teszi, hogy az alkalmazás további effektusokat alkalmazzon a szöveg renderelésekor, például egyéni kitöltés vagy vázlat esetén. A DirectWrite Hello World Sampletartalmaz egy egyéni minta szövegmegjelenítőt.
3. Render ClearType egy GDI-felületre.
A GDI-felületre való renderelés valójában példa egy egyéni szöveg renderelő használatára. A munka egy része azonban az IDWriteBitmapRenderTarget felület formájában készül el.
A felület létrehozásához használja az IDWriteGdiInterop::CreateBitmapRenderTarget metódust.
Az egyéni szöveglejátszó DrawGlyphRun metódusa meghívja a IDWriteBitmapRenderTarget::D rawGlyphRun metódust a karakterjelek rajzolásához. Az aláhúzás, az áthúzás és az in-line objektumok megjelenítését az egyéni renderelőnek kell elvégeznie.
Az IDWriteBitmapRenderTarget felület a memóriabeli eszközkörnyezethez (DC) készít renderelést. Ehhez a DC-hez a IDWriteBitmapRenderTarget::GetMemoryDC metódus használatával juthat hozzá.
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
A rajz végrehajtása után a IDWriteBitmapRenderTarget objektum memória DC-jét át kell másolni a cél GDI-felületre.
Jegyzet
Lehetősége van arra is, hogy a bitképet egy másik típusú felületre, például egy GDI+ felületre helyezze át.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);
Jegyzet
Az alkalmazás felelőssége, hogy mindent megjelenítsen az ablakban a végén. Ez magában foglalja a szöveget és a grafikus elemeket. Erre teljesítménybüntetés van. Emellett a memória eszköz kontextusra való renderelés nem GDI hardveres gyorsítás.
A GDI-vel való együttműködés részletesebb áttekintéséhez lásd: GDI-vel való együttműködés.
4. Szürkeárnyalatos szöveg megjelenítése transzparensen egy GDI-felületre. (Windows 8 és újabb verziók)
A Windows 8-tól kezdve a jobb teljesítmény érdekében a szürkeárnyalatos szöveget transzparensen jelenítheti meg egy GDI-felületen. Ehhez a következőkre van szüksége:
- Tisztítsa meg a memória DC-t, hogy átlátszó legyen.
- Szöveg megjelenítése a memória HDC-be szürkeárnyalatos antialiasing (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE) használatával.
- Az AlphaBlend függvénnyel transzparensen jeleníti meg a memória HDC-t a végső cél HDC fölé.
- Ismételje meg annyiszor, ahányszor szükséges (például egyszer glyphegységenként), és közben más ábrák közvetlenül a végső cél HDC-be rajzolhatók anélkül, hogy a AlphaBlend függvény felülírná azokat.
pRT_->SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
BLENDFUNCTION blendFunction = { 0 };
blendFunction.BlendOp = AC_SRC_OVER;
blendFunction.SourceConstantAlpha = 255;
blendFunction.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(
hdc,
0, 0,
width, height,
pRT_->GetMemoryDC(),
0, 0,
width, height,
blendFunction
);
Kapcsolódó témakörök
-
Renderelés Direct2D- használatával