DirectWrite de rendu
Options de rendu
Le texte avec une mise en forme décrite par un seul objet IDWriteTextFormat peut être rendu avec Direct2D, toutefois, il existe quelques options supplémentaires pour le rendu d’un objet IDWriteTextLayout .
La chaîne décrite par un objet IDWriteTextLayout peut être rendue à l’aide des méthodes ci-dessous.
1. rendu à l’aide de Direct2D
Pour afficher un objet IDWriteTextLayout à l’aide de Direct2D, utilisez la méthode ID2D1RenderTarget ::D rawtextlayout , comme indiqué dans le code suivant.
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
Pour plus d’informations sur le dessin d’un objet IDWriteTextLayout à l’aide de Direct2D, consultez prise en main avec DirectWrite.
2. effectuer un rendu à l’aide d’un convertisseur de texte personnalisé.
Vous pouvez effectuer le rendu avec un convertisseur personnalisé à l’aide de la méthode IDWriteTextLayout ::D RAW , qui prend une interface de rappel dérivée de IDWriteTextRenderer comme argument, comme indiqué dans le code suivant.
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
La méthode IDWriteTextLayout ::D RAW appelle les méthodes du rappel de convertisseur personnalisé que vous fournissez. Les méthodes DrawGlyphRun, DrawUnderline, DrawInlineObjectet DrawStrikethrough effectuent les fonctions de dessin.
IDWriteTextRenderer déclare des méthodes pour dessiner des objets d’exécution de glyphe, de soulignement, de barré et de ligne. C’est à l’application d’implémenter ces méthodes. La création d’un convertisseur de texte personnalisé permet à l’application d’appliquer des effets supplémentaires lors du rendu de texte, tel qu’un remplissage ou un plan personnalisé. un exemple de convertisseur de texte personnalisé est inclus dans l' exemple DirectWrite Hello World.
3. afficher ClearType sur une surface GDI.
Le rendu sur une surface GDI est en fait un exemple d’utilisation d’un convertisseur de texte personnalisé. Toutefois, une partie du travail est effectuée pour vous sous la forme de l’interface IDWriteBitmapRenderTarget .
Pour créer cette interface, utilisez la méthode IDWriteGdiInterop :: CreateBitmapRenderTarget .
La méthode DrawGlyphRun de votre convertisseur de texte personnalisé appelle la méthode IDWriteBitmapRenderTarget ::D rawglyphrun pour dessiner les glyphes. Le rendu des objets souligné, barré et Inline doit être effectué par votre convertisseur personnalisé.
L’interface IDWriteBitmapRenderTarget est rendue en mémoire dans un contexte de périphérique (DC). Vous recevez un handle vers ce contrôleur de périphérique à l’aide de la méthode IDWriteBitmapRenderTarget :: GetMemoryDC .
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
Une fois le dessin effectué, le DC de mémoire de l’objet IDWriteBitmapRenderTarget doit être copié sur la surface GDI de destination.
Notes
vous avez également la possibilité de transférer l’image bitmap vers un autre type de surface, tel qu’une surface GDI+.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);
Notes
Votre application est chargée de rendre tout ce qui se passe dans la fenêtre de fin. Cela comprend le texte et les graphiques. Il y a une baisse des performances. En outre, le rendu sur un DC de mémoire n’est pas l’accélération matérielle GDI.
Pour obtenir une vue d’ensemble plus détaillée de l’interopérabilité avec GDI, consultez interopérabilité avec GDI.
4. Affichez le texte en nuances de gris en toute transparence sur une surface GDI. (Windows 8 et versions ultérieures)
à partir de Windows 8, vous pouvez restituer du texte en nuances de gris de manière transparente sur une surface GDI pour obtenir de meilleures performances. Pour ce faire, vous devez :
- Effacez le DC de mémoire pour le rendre transparent.
- Restituer du texte sur la mémoire HDC en utilisant l’anticrénelage de nuances de gris (DWRITE _ Text _ anticrénelage _ mode _ nuances de gris).
- Utilisez la fonction AlphaBlend pour restituer la mémoire HDC en toute transparence sur le HDC cible final.
- Répétez cette opération autant de fois que nécessaire (par exemple une fois par exécution de glyphe) et entre d’autres graphiques peuvent être rendus directement sur le HDC cible final sans être remplacés par la fonction 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
);