DirectWrite de rendu
Options de rendu
Le texte avec une mise en forme décrite par un objet IDWriteTextFormat uniquement 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 restituer 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. Rendu à l’aide d’un convertisseur de texte personnalisé.
Vous effectuez un rendu avec un convertisseur personnalisé à l’aide de la méthode IDWriteTextLayout::D raw , qui prend une interface de rappel dérivée d’IDWriteTextRenderer comme argument, comme illustré 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 renderer personnalisé que vous fournissez. Les méthodes DrawGlyphRun, DrawUnderline, DrawInlineObject et DrawStrikethrough exécutent les fonctions de dessin.
IDWriteTextRenderer déclare des méthodes pour dessiner une exécution de glyphe, un soulignement, un barré et des objets inline. Il appartient à 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 du texte, comme un remplissage ou un contour personnalisé. Un exemple de convertisseur de texte personnalisé est inclus dans l’exemple DirectWrite Hello World.
3. Restituez 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és, barrés et inline doit être effectué par votre convertisseur personnalisé.
L’interface IDWriteBitmapRenderTarget s’affiche dans un contexte d’appareil (DC) en mémoire. Vous obtenez un handle pour ce contrôleur de domaine à l’aide de la méthode IDWriteBitmapRenderTarget::GetMemoryDC .
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
Une fois le dessin effectué, le contrôleur de domaine 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, par exemple 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 a la responsabilité de rendre tout à la fenêtre à la fin. Cela inclut le texte et les graphiques. Il y a une pénalité de performance à cela. En outre, le rendu vers un contrôleur de domaine de mémoire n’est pas accéléré par le matériel GDI.
Pour une vue d’ensemble plus détaillée de l’interopérabilité avec GDI, consultez Interopérabilité avec GDI.
4. Rendre le texte en nuances de gris en transparence sur une surface GDI. (Windows 8 et versions ultérieures)
À partir de Windows 8, vous pouvez afficher le texte en nuances de gris en toute transparence sur une surface GDI pour de meilleures performances. Pour ce faire, vous devez :
- Effacez le contrôleur de domaine de mémoire pour qu’il soit transparent.
- Restituez le texte dans la mémoire HDC à l’aide d’un anti-attirail de nuances de gris (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
- Utilisez la fonction AlphaBlend pour afficher la mémoire HDC en toute transparence sur le HDC cible final.
- Répétez autant de fois que nécessaire (par exemple, une fois par exécution de glyphe) et entre d’autres graphiques peut être rendu directement sur le HDC cible final sans être remplacé 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
);
Rubriques connexes