Rendre sur une surface GDI
dans certains cas, vous souhaiterez peut-être afficher DirectWrite texte sur une surface GDI. L’interface IDWriteBitmapRenderTarget encapsule une bitmap et un contexte de périphérique pour le rendu du texte. Vous créez un IDWriteBitmapRenderTarget à l’aide de la méthode IDWriteGdiInterop :: CreateBitmapRenderTarget , comme illustré dans le code suivant.
if (SUCCEEDED(hr))
{
hr = g_pGdiInterop->CreateBitmapRenderTarget(hdc, r.right, r.bottom, &g_pBitmapRenderTarget);
}
Pour effectuer le rendu avec un IDWriteBitmapRenderTarget, vous devez implémenter une interface de rappel de convertisseur de convertisseur de texte personnalisée dérivée de l’interface IDWriteTextRenderer . Vous devez implémenter des méthodes pour dessiner une exécution de glyphes, un soulignement, un barré, des objets insérés, et ainsi de suite. Pour obtenir la liste complète des méthodes, consultez la page de référence IDWriteTextRenderer . Toutes les méthodes ne doivent pas être implémentées, elles peuvent simplement retourner E _ NOTIMPL et le dessin se poursuivra.
Vous pouvez ensuite dessiner le texte à l’aide de la méthode IDWriteTextLayout ::D RAW et en passant l’interface de rappel que vous avez implémentée en tant que paramètre. 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.
Dans votre implémentation de DrawGlyphRun, appelez 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é.
IDWriteBitmapRenderTarget ::D rawglyphrun a un paramètre rect out facultatif qui contient les limites de la zone dans laquelle le texte a été dessiné. Vous pouvez utiliser ces informations pour définir le rectangle englobant du contexte de périphérique à l’aide de la fonction SetBoundsRect fournie par GDI. Le code suivant est un exemple d’implémentation de la méthode DrawGlyphRun d’un convertisseur personnalisé.
STDMETHODIMP GdiTextRenderer::DrawGlyphRun(
__maybenull void* clientDrawingContext,
FLOAT baselineOriginX,
FLOAT baselineOriginY,
DWRITE_MEASURING_MODE measuringMode,
__in DWRITE_GLYPH_RUN const* glyphRun,
__in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
IUnknown* clientDrawingEffect
)
{
HRESULT hr = S_OK;
// Pass on the drawing call to the render target to do the real work.
RECT dirtyRect = {0};
hr = pRenderTarget_->DrawGlyphRun(
baselineOriginX,
baselineOriginY,
measuringMode,
glyphRun,
pRenderingParams_,
RGB(0,200,255),
&dirtyRect
);
return hr;
}
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 . Dès que le dessin a été effectué, le DC de mémoire de l’objet IDWriteBitmapRenderTarget doit être copié sur la surface GDI de destination.
vous pouvez récupérer le rectangle englobant à l’aide de la fonction GetBoundsRect , puis utiliser le rectangle englobant avec la fonction BitBlt pour copier le texte DirectWrite rendu du DC de la mémoire vers la surface GDI, comme indiqué dans le code suivant.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);