GDI Surface にレンダリングする

場合によっては、GDI サーフェイスにDirectWriteテキストを表示できる場合があります。 IDWriteBitmapRenderTarget インターフェイスは、テキストをレンダリングするビットマップとデバイス コンテキストをカプセル化します。 次のコードに示すように、IDWriteGdiInterop::CreateBitmapRenderTarget メソッドを使用して IDWriteBitmapRenderTarget を作成します。

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

IDWriteBitmapRenderTarget でレンダリングするには、IDWriteTextRenderer インターフェイスから派生したカスタム テキスト レンダラー コールバック インターフェイスを実装する必要があります。 グリフの実行、下線、取り消し線、インライン オブジェクトなどを描画するためのメソッドを実装する必要があります。 メソッドの完全な一覧については、 IDWriteTextRenderer リファレンス ページを参照してください。 すべてのメソッドを実装する必要があるわけではありません。 E_NOTIMPLを返すだけで、描画は続行されます。

その後、 IDWriteTextLayout::D raw メソッドを使用し、パラメーターとして実装したコールバック インターフェイスを渡すことで、テキストを描画できます。 IDWriteTextLayout::D raw メソッドは、指定したカスタム レンダラー コールバックのメソッドを呼び出します。 DrawGlyphRunDrawUnderlineDrawInlineObject、および DrawStrikethrough メソッドは、描画関数を実行します。

DrawGlyphRun の実装で、IDWriteBitmapRenderTarget::D rawGlyphRun メソッドを呼び出してグリフを描画します。 下線、取り消し線、インライン オブジェクトのレンダリングは、カスタム レンダラーによって行う必要があります。

IDWriteBitmapRenderTarget::D rawGlyphRun には、テキストが描画された領域の境界を含むオプションの RECT out パラメーターがあります。 この情報を使用すると、GDI によって提供される SetBoundsRect 関数を使用して、デバイス コンテキストの外接する四角形を設定できます。 次のコードは、カスタム レンダラーの DrawGlyphRun メソッドの実装例です。

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;
}

IDWriteBitmapRenderTarget インターフェイスは、メモリ内のデバイス コンテキスト (DC) にレンダリングされます。 IDWriteBitmapRenderTarget::GetMemoryDC メソッドを使用して、この DC へのハンドルを取得します。 図面が実行されるとすぐに、 IDWriteBitmapRenderTarget オブジェクトのメモリ DC をコピー先の GDI サーフェスにコピーする必要があります。

GetBoundsRect 関数を使用して外接する四角形を取得し、BitBlt 関数で外接する四角形を使用して、次のコードに示すように、レンダリングされたDirectWriteテキストをメモリ DC から GDI サーフェスにコピーできます。

// Transfer from DWrite's rendering target to the window.
BitBlt(
    hdc,
    0, 0,
    size.cx, size.cy,
    memoryHdc,
    0, 0, 
    SRCCOPY | NOMIRRORBITMAP
    );