Partager via


Rendu sur une Surface GDI

Dans certains cas, vous pouvez être en mesure d’afficher DirectWrite texte sur une surface GDI. L’interface IDWriteBitmapRenderTarget encapsule un contexte bitmap et d’appareil sur lequel afficher le texte. Vous créez un IDWriteBitmapRenderTarget à l’aide de la méthode IDWriteGdiInterop::CreateBitmapRenderTarget , comme indiqué dans le code suivant.

if (SUCCEEDED(hr))
{
    hr = g_pGdiInterop->CreateBitmapRenderTarget(hdc, r.right, r.bottom, &g_pBitmapRenderTarget);
}

Pour effectuer un rendu avec un objet IDWriteBitmapRenderTarget, vous devez implémenter une interface de rappel 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 glyphe, un soulignement, un barré, des objets inline, etc. 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 continue.

Vous pouvez ensuite dessiner le texte à l’aide de la méthode IDWriteTextLayout::D raw et passer 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 renderer personnalisé que vous fournissez. Les méthodes DrawGlyphRun, DrawUnderline, DrawInlineObject et DrawStrikethrough exécutent 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és, barrés et inline doit être effectué par votre convertisseur personnalisé.

IDWriteBitmapRenderTarget::D rawGlyphRun a un paramètre de sortie RECT facultatif qui contient les limites de la zone où le texte a été dessiné. Vous pouvez utiliser ces informations pour définir le rectangle englobant du contexte d’appareil avec la fonction SetBoundsRect fournie par GDI. Le code suivant est un exemple d’implémentation de la méthode DrawGlyphRun d’un renderer 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 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 . 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.

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 contrôleur de domaine 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
    );