Baca dalam bahasa Inggris

Bagikan melalui


Merender ke Permukaan GDI

Dalam beberapa kasus, Anda mungkin ingin dapat menampilkan teks DirectWrite pada permukaan GDI. Antarmuka IDWriteBitmapRenderTarget merangkum bitmap dan konteks perangkat untuk merender teks ke dalamnya. Anda membuat metode IDWriteBitmapRenderTarget dengan menggunakan metode IDWriteGdiInterop::CreateBitmapRenderTarget , seperti yang ditunjukkan dalam kode berikut.

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

Untuk merender dengan IDWriteBitmapRenderTarget, Anda harus menerapkan antarmuka panggilan balik perender teks kustom yang berasal dari antarmuka IDWriteTextRenderer . Anda harus menerapkan metode untuk menggambar eksekusi glyph, garis bawah, coretan, objek sebaris, dan sebagainya. Untuk daftar lengkap metode, lihat halaman referensi IDWriteTextRenderer . Tidak setiap metode harus diimplementasikan, mereka hanya dapat mengembalikan E_NOTIMPL, dan menggambar akan berlanjut.

Anda kemudian dapat menggambar teks dengan menggunakan metode IDWriteTextLayout::D raw dan meneruskan antarmuka panggilan balik yang Anda terapkan sebagai parameter. Metode IDWriteTextLayout::D raw memanggil metode panggilan balik perender kustom yang Anda sediakan. Metode DrawGlyphRun, DrawUnderline, DrawInlineObject, dan DrawStrikethrough melakukan fungsi gambar.

Dalam implementasi DrawGlyphRun Anda, panggil metode IDWriteBitmapRenderTarget::D rawGlyphRun untuk menggambar glyph. Penyajian garis bawah, coretan, dan objek sebaris harus dilakukan oleh perender kustom Anda.

IDWriteBitmapRenderTarget::D rawGlyphRun memiliki parameter RECT out opsional yang berisi batas area tempat teks digambar. Anda dapat menggunakan informasi ini untuk mengatur persegi panjang pembatas untuk konteks perangkat dengan fungsi SetBoundsRect yang disediakan oleh GDI. Kode berikut adalah contoh implementasi metode DrawGlyphRun dari perender kustom.

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

Antarmuka IDWriteBitmapRenderTarget dirender ke konteks perangkat (DC) dalam memori. Anda mendapatkan handel ke DC ini dengan menggunakan metode IDWriteBitmapRenderTarget::GetMemoryDC . Segera setelah gambar dilakukan, DC memori objek IDWriteBitmapRenderTarget harus disalin ke permukaan GDI tujuan.

Anda dapat mengambil persegi panjang pembatas dengan menggunakan fungsi GetBoundsRect, lalu menggunakan persegi panjang pembatas dengan fungsi BitBlt untuk menyalin teks DirectWrite yang dirender dari DC memori ke permukaan GDI seperti yang ditunjukkan dalam kode berikut.

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