Renderowanie DirectWrite
Opcje renderowania
Tekst z formatowaniem opisanym tylko przez obiekt IDWriteTextFormat można renderować za pomocą Direct2D, jednak istnieje kilka innych opcji renderowania obiektu IDWriteTextLayout.
Ciąg opisany przez obiekt IDWriteTextLayout można renderować przy użyciu poniższych metod.
1. Renderowanie przy użyciu funkcji Direct2D
Aby renderować obiekt IDWriteTextLayout przy użyciu Direct2D, użyj metody ID2D1RenderTarget::DrawTextLayout, jak pokazano w poniższym kodzie.
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
Aby uzyskać bardziej szczegółowe informacje na temat rysunku obiektu IDWriteTextLayout przy użyciu Direct2D, zobacz Getting Started with DirectWrite.
2. Renderowanie przy użyciu niestandardowego modułu renderowania tekstu.
Renderowanie za pomocą niestandardowego modułu renderowania odbywa się przy użyciu metody IDWriteTextLayout::Draw, która przyjmuje interfejs wywołania zwrotnego pochodzący z IDWriteTextRenderer jako argument, jak pokazano w poniższym kodzie.
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
Metoda IDWriteTextLayout::Draw wywołuje metody niestandardowego wywołania zwrotnego modułu renderowania, które podasz. DrawGlyphRun, DrawUnderline, DrawInlineObject, i DrawStrikethrough, metody wykonują funkcje rysunku.
IDWriteTextRenderer deklaruje metody rysowania przebiegu glif, podkreślenie, przekreślenie i wbudowane obiekty. Do aplikacji należy zaimplementowanie tych metod. Utworzenie niestandardowego modułu renderowania tekstu umożliwia aplikacji stosowanie dodatkowych efektów podczas renderowania tekstu, takiego jak wypełnienie niestandardowe lub konspekt. Przykładowy moduł renderowania tekstu niestandardowego znajduje się w DirectWrite Hello World Sample.
3. Renderowanie funkcji ClearType na powierzchnię GDI.
Renderowanie na powierzchni GDI jest w rzeczywistości przykładem użycia niestandardowego modułu renderowania tekstu. Jednak niektóre zadania są wykonywane dla ciebie w postaci interfejsu IDWriteBitmapRenderTarget.
Aby utworzyć ten interfejs, użyj metody IDWriteGdiInterop::CreateBitmapRenderTarget.
Metoda DrawGlyphRun niestandardowego modułu renderowania tekstu wywołuje metodę IDWriteBitmapRenderTarget::DrawGlyphRun, aby narysować glify. Renderowanie podkreślenia, przekreślenia i wbudowanych obiektów musi być wykonywane przez własny renderer.
Interfejs IDWriteBitmapRenderTarget jest renderowany do kontekstu urządzenia (DC) w pamięci. Aby uzyskać dojście do tego kontrolera domeny, użyj metody IDWriteBitmapRenderTarget::GetMemoryDC.
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
Po wykonaniu rysunku kontroler domeny pamięci IDWriteBitmapRenderTarget obiektu musi zostać skopiowany na docelową powierzchnię GDI.
Notatka
Istnieje również możliwość przeniesienia mapy bitowej do innego typu powierzchni, takiego jak powierzchnia GDI+.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);
Notatka
Twoja aplikacja jest odpowiedzialna za ostateczne renderowanie wszystkiego w oknie. Obejmuje to tekst i grafikę. Wiąże się to z obniżeniem wydajności. Ponadto renderowanie do DC pamięci nie jest sprzętowo przyspieszane przez GDI.
Aby uzyskać bardziej szczegółowe omówienie interoperacji z GDI, zobacz Interoperating with GDI.
4. Renderuj tekst w skali szarości w przezroczysty sposób na powierzchnię GDI. (System Windows 8 lub nowszy)
Począwszy od systemu Windows 8, można renderować tekst w skali szarości w przezroczysty sposób na powierzchnię GDI w celu uzyskania lepszej wydajności. W tym celu należy wykonać następujące czynności:
- Wyczyść kontroler domeny pamięci, aby był przezroczysty.
- Renderuj tekst w pamięci HDC, używając antyaliasingu w skali szarości (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
- Funkcja AlphaBlend umożliwia przezroczyste renderowanie pamięci HDC na docelowej powierzchni HDC.
- Powtórz tyle razy, ile jest to konieczne (na przykład, raz na przebieg glifu) i pomiędzy innymi grafikami może być renderowane bezpośrednio do końcowego docelowego HDC bez nadpisania przez funkcję AlphaBlend.
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
);
Tematy pokrewne