共用方式為


轉譯為 GDI 介面

在某些情況下,您可能想要能夠在 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方法會呼叫您提供的自訂轉譯器回呼方法。 DrawGlyphRunDrawUnderlineDrawInlineObjectDrawStrikethrough方法會執行繪圖函式。

在您的 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
    );