共用方式為


轉譯至 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::Draw 方法來繪製文字,並將您實作的回呼介面作為參數傳遞。 IDWriteTextLayout::Draw 方法會呼叫您提供的自訂轉譯器回呼方法。 DrawGlyphRunDrawUnderlineDrawInlineObject,以及 DrawStrikethrough 方法執行繪圖函式。

在您的 DrawGlyphRun實作中,呼叫 IDWriteBitmapRenderTarget::DrawGlyphRun 方法來繪製字形。 您的自訂渲染器必須執行底線、刪除線和內嵌物件的渲染。

IDWriteBitmapRenderTarget: DrawGlyphRun 具有可以選擇的 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
    );