Aracılığıyla paylaş


DirectWrite İşleme

İşleme Seçenekleri

Yalnızca bir IDWriteTextFormat nesnesi tarafından tanımlanan biçimlendirmeye sahip metin, Direct2Dile işlenebilir, ancak IDWriteTextLayout nesnesini işlemek için birkaç seçenek daha vardır.

IDWriteTextLayout nesnesi tarafından açıklanan dize aşağıdaki yöntemler kullanılarak işlenebilir.

1. Direct2D kullanarak işleme

IDWriteTextLayout nesnesini Direct2D kullanarak işlemek için, aşağıdaki kodda gösterildiği gibi ID2D1RenderTarget::D rawTextLayoutyönteminikullanın.

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

Direct2Dkullanarak bir IDWriteTextLayout nesnesi çizmeye daha ayrıntılı bir bakış için, DirectWritekullanmaya başlama konusuna bakın.

2. Özel bir metin işleyici kullanarak işleme.

IDWriteTextLayout::Draw yöntemini kullanarak, IDWriteTextRenderer türetilmiş bir geri çağırma arabirimi bağımsız değişkenini alarak özel bir işleyiciyle render yaparsınız, aşağıdaki kodda gösterildiği gibi.

// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
        NULL,
        pTextRenderer_,  // Custom text renderer.
        origin.x,
        origin.y
        );

IDWriteTextLayout::Draw yöntemi, sağladığınız özel işleyici geri çağırma yöntemlerinin yöntemlerini çağırır. DrawGlyphRun, DrawUnderline, DrawInlineObjectve DrawStrikethrough yöntemleri çizim işlevlerini gerçekleştirir.

IDWriteTextRenderer, bir glif çalıştırma, alt çizgi, üstü çizili ve satır içi nesneler çizme yöntemlerini bildirir. Bu yöntemleri uygulamak uygulamaya bağlı. Özel metin işleyicisi oluşturmak, uygulamanın metin işlenirken özel dolgu veya ana hat gibi ek efektler uygulamasına olanak tanır. Örnek bir özel metin işleyicisi, DirectWrite Hello World Örneğiiçinde bulunur.

3. ClearType'ı bir GDI yüzeyine işleme.

GDI yüzeyine işleme, özel metin işleyicisi kullanmanın bir örneğidir. Ancak, bazı işler sizin için IDWriteBitmapRenderTarget arabiriminden faydalanılarak yapılır.

Bu arabirimi oluşturmak için IDWriteGdiInterop::CreateBitmapRenderTarget yöntemini kullanın.

Özel metin işleyicinizin DrawGlyphRun yöntemi, IDWriteBitmapRenderTarget::D rawGlyphRun yöntemini çağırarak glifleri çizer. Alt çizgi, üstü çizili ve satır içi nesnelerin işlenmesi özel işleyiciniz tarafından yapılmalıdır.

IDWriteBitmapRenderTarget arabirimi, bellekteki bir cihaz bağlamına (DC) render eder. IDWriteBitmapRenderTarget::GetMemoryDC yöntemini kullanarak bu DC için bir tutamacı elde edersiniz.

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

Çizim gerçekleştirildikten sonra, IDWriteBitmapRenderTarget nesnesinin bellek DC'si hedef GDI yüzeyine kopyalanmalıdır.

Not

Bit eşlemi GDI+ yüzey gibi başka bir yüzey türüne aktarma seçeneğiniz de vardır.

 

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

Not

Uygulamanız, sonunda her şeyi pencereye işlemekle yükümlüdür. Buna metin ve grafikler dahildir. Bunun bir performans cezası vardır. Ayrıca, bellek DC'sine yapılan işleme GDI donanım hızlandırmasıyla desteklenmemektedir.

 

GDI ile birlikte çalışma hakkında daha ayrıntılı bir genel bakış için bkz. GDIile birlikte çalışma.

4. Gri Tonlamalı Metni GDI Yüzeyine Saydam Olarak İşleme. (Windows 8 ve üzeri)

Windows 8'den başlayarak, daha iyi performans için gri tonlamalı metni bir GDI yüzeyine saydam bir şekilde işleyebilirsiniz. Bunu yapmak için yapmanız gerekenler:

  1. Bellek DC'sini saydam olarak ayarlayın.
  2. Gri tonlamalı dengeleme (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE) kullanarak metni bellek HDC'sine işleme.
  3. Bellek HDC'sini son hedef HDC'nin üzerinde saydam olarak işlemek için AlphaBlend işlevini kullanın.
  4. Gerektiği kadar tekrar edin (örneğin, glif çalıştırması başına bir kez) ve diğer grafiklerin arasında AlphaBlend işlevi tarafından üzerine yazılmadan doğrudan son hedef HDC'ye işlenebilir.
pRT_->SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

BLENDFUNCTION blendFunction = { 0 };  
blendFunction.BlendOp = AC_SRC_OVER;  
blendFunction.SourceConstantAlpha = 255;  
blendFunction.AlphaFormat = AC_SRC_ALPHA;

AlphaBlend(  
        hdc,  
        0, 0,  
        width, height,  
        pRT_->GetMemoryDC(),  
        0, 0,  
        width, height,  
        blendFunction  
        );

Direct2D kullanarak işleme

Özel Metin Oluşturucu Kullanarak Oluşturma

GDI yüzeyine işleme

GDI ile Birlikte Çalışma