Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
DirectWritemetin düzeni, IDWriteTextRenderertüretilen özel bir metin işleyicisi tarafından çizilebilir. DirectWrite'in bit eşlem veya GDI yüzeyine işleme, satır içi nesneler ve istemci çizim efektleri gibi bazı gelişmiş özelliklerinden yararlanmak için özel işleyici gereklidir. Bu öğretici, IDWriteTextRendereryöntemlerini açıklar ve bit eşlem dolgusuyla metin işlemek için Direct2D kullanan örnek bir uygulama sağlar.
Bu öğretici aşağıdaki bölümleri içerir:
- Oluşturucu
- DrawGlyphRun()
- DrawUnderline() ve DrawStrikethrough()
-
Piksel Tuturma, Piksel Başına DIP ve Dönüştürme
- isPixelSnappingDisabled()
- GetCurrentTransform()
- GetPixelsPerDip()
- DrawInlineObject()
- Yıkıcı
- Özel Metin İşleyici Kullanarak
Özel metin işleyicinizin IUnknown'dan devralınan yöntemleri, IDWriteTextRenderer başvuru sayfasında ve altında listelenen yöntemlere ek olarak uygulaması gerekir.
Özel metin işleyicisinin tam kaynak kodu için directwrite Hello World Sample CustomTextRenderer.cpp ve CustomTextRenderer.h dosyalarına bakın.
Oluşturucu
Özel metin işleyicinizin bir oluşturucuya ihtiyacı vardır. Bu örnek, metni işlemek için hem düz hem de bit eşlem Direct2D fırçalarını kullanır.
Bu nedenle, oluşturucu aşağıdaki tabloda bulunan parametreleri açıklamalarla birlikte alır.
| Parametre | Açıklama |
|---|---|
| pD2DFactory | Gereken Direct2D kaynaklarını oluşturmak için kullanılacak ID2D1Factory nesnesine yönelik bir işaretçi. |
| pRT | Metnin işlendirileceği ID2D1HwndRenderTarget nesnesine bir işaretçi. |
| pOutlineBrush | Metnin ana hattını çizmek için kullanılacak olan ID2D1SolidColorBrush işaretçisidir. |
| pFillBrush | Metni doldurmak için kullanılacak ID2D1BitmapBrush işaretçisi. |
Bunlar, aşağıdaki kodda gösterildiği gibi oluşturucu tarafından depolanır.
CustomTextRenderer::CustomTextRenderer(
ID2D1Factory* pD2DFactory,
ID2D1HwndRenderTarget* pRT,
ID2D1SolidColorBrush* pOutlineBrush,
ID2D1BitmapBrush* pFillBrush
)
:
cRefCount_(0),
pD2DFactory_(pD2DFactory),
pRT_(pRT),
pOutlineBrush_(pOutlineBrush),
pFillBrush_(pFillBrush)
{
pD2DFactory_->AddRef();
pRT_->AddRef();
pOutlineBrush_->AddRef();
pFillBrush_->AddRef();
}
DrawGlyphRun()
DrawGlyphRun yöntemi, metin oluşturucunun ana geri çağırma yöntemidir. Gliflerin işleneceği bir dizi, temel çizgi başlangıç noktası ve ölçüm modu gibi bilgilerle birlikte geçirilir. Ayrıca, glif çalışmasına uygulanacak bir istemci çizim efekti nesnesi de geçirir. Daha fazla bilgi için, Metin Düzenine İstemci Çizim Efektleri Ekleme konusuna bakın.
Bu metin işleyici uygulaması, glif dizilimlerini Direct2D geometrilerine dönüştürerek ve sonra geometrileri çizip doldurarak işler. Bu, aşağıdaki adımlardan oluşur.
ID2D1PathGeometry nesnesi oluşturun ve ID2D1PathGeometry::Open yöntemini kullanarak ID2D1GeometrySinknesnesinialın.
// Create the path geometry. ID2D1PathGeometry* pPathGeometry = NULL; hr = pD2DFactory_->CreatePathGeometry( &pPathGeometry ); // Write to the path geometry using the geometry sink. ID2D1GeometrySink* pSink = NULL; if (SUCCEEDED(hr)) { hr = pPathGeometry->Open( &pSink ); }DWRITE_GLYPH_RUN, DrawGlyphRun fonksiyonuna geçilirken, tüm glif yürütüşü için yazı tipi yüzünü temsil eden fontFaceadlı bir IDWriteFontFace nesnesini içerir. Aşağıdaki kodda gösterildiği gibi IDWriteFontFace:: GetGlyphRunOutline yöntemini kullanarak glif çizgisini geometri alanına yerleştirin.
// Get the glyph run outline geometries back from DirectWrite and place them within the // geometry sink. if (SUCCEEDED(hr)) { hr = glyphRun->fontFace->GetGlyphRunOutline( glyphRun->fontEmSize, glyphRun->glyphIndices, glyphRun->glyphAdvances, glyphRun->glyphOffsets, glyphRun->glyphCount, glyphRun->isSideways, glyphRun->bidiLevel%2, pSink ); }Geometri lavabosunu doldurduktan sonra onu kapatın.
// Close the geometry sink if (SUCCEEDED(hr)) { hr = pSink->Close(); }Aşağıdaki kodda gösterildiği gibi, glif çalıştırmasının kaynağı doğru temel kaynaktan işlenecek şekilde çevrilmelidir.
// Initialize a matrix to translate the origin of the glyph run. D2D1::Matrix3x2F const matrix = D2D1::Matrix3x2F( 1.0f, 0.0f, 0.0f, 1.0f, baselineOriginX, baselineOriginY );baselineOriginX ve baselineOriginY, DrawGlyphRun geri çağırma yöntemine parametre olarak geçirilir.
ID2D1Factory::CreateTransformedGeometry yöntemini kullanarak ve yol geometrisini ve çeviri matrisini geçirerek dönüştürülmüş geometriyi oluşturun.
// Create the transformed geometry ID2D1TransformedGeometry* pTransformedGeometry = NULL; if (SUCCEEDED(hr)) { hr = pD2DFactory_->CreateTransformedGeometry( pPathGeometry, &matrix, &pTransformedGeometry ); }Son olarak, dönüştürülen geometrinin ana hattını çizin ve ID2D1RenderTarget::DrawGeometry ve ID2D1RenderTarget::FillGeometry yöntemleri ile üye değişken olarak depolanan Direct2D fırçalarını kullanarak doldurun.
// Draw the outline of the glyph run pRT_->DrawGeometry( pTransformedGeometry, pOutlineBrush_ ); // Fill in the glyph run pRT_->FillGeometry( pTransformedGeometry, pFillBrush_ );Çizimi tamamladığınıza göre, bu yöntemde oluşturulan nesneleri temizlemeyi unutmayın.
SafeRelease(&pPathGeometry); SafeRelease(&pSink); SafeRelease(&pTransformedGeometry);
DrawUnderline() ve DrawStrikethrough()
IDWriteTextRenderer , alt çizgi ve üstü çizili çizmeye yönelik geri çağırım işlevlerine de sahiptir. Bu örnek, altı çizili veya üstü çizili basit bir dikdörtgen çizer, ancak farklı şekiller de çizilebilir.
Direct2D kullanarak bir alt çizgi çizmek aşağıdaki adımlardan oluşur.
Öncelikle, alt çizginin boyutu ve şekli için bir D2D1_RECT_F yapısı oluşturun. DWRITE_UNDERLINE yapısı, DrawUnderline geri çağırma yöntemine geçirilirken alt çizginin uzaklığını, genişliğini ve kalınlığını sağlar.
D2D1_RECT_F rect = D2D1::RectF( 0, underline->offset, underline->width, underline->offset + underline->thickness );Ardından, ID2D1Factory::CreateRectangleGeometry yöntemini ve başlatılan D2D1_RECT_F yapısını kullanarak bir ID2D1RectangleGeometry nesnesi oluşturun.
ID2D1RectangleGeometry* pRectangleGeometry = NULL; hr = pD2DFactory_->CreateRectangleGeometry( &rect, &pRectangleGeometry );Glif çalıştırmada olduğu gibi, alt çizgi geometrisinin kaynağı, CreateTransformedGeometry yöntemi kullanılarak taban çizgisi kaynak değerlerine göre çevrilmelidir.
// Initialize a matrix to translate the origin of the underline D2D1::Matrix3x2F const matrix = D2D1::Matrix3x2F( 1.0f, 0.0f, 0.0f, 1.0f, baselineOriginX, baselineOriginY ); ID2D1TransformedGeometry* pTransformedGeometry = NULL; if (SUCCEEDED(hr)) { hr = pD2DFactory_->CreateTransformedGeometry( pRectangleGeometry, &matrix, &pTransformedGeometry ); }Son olarak, dönüştürülen geometrinin çevre çizgisini çizin ve ID2D1RenderTarget::DrawGeometry ve ID2D1RenderTarget::FillGeometry yöntemleri ile üye değişkeni olarak saklanan Direct2D fırçalarını kullanarak doldurun.
// Draw the outline of the glyph run pRT_->DrawGeometry( pTransformedGeometry, pOutlineBrush_ ); // Fill in the glyph run pRT_->FillGeometry( pTransformedGeometry, pFillBrush_ );Çizimi tamamladığınıza göre, bu yöntemde oluşturulan nesneleri temizlemeyi unutmayın.
SafeRelease(&pRectangleGeometry); SafeRelease(&pTransformedGeometry);
Üstü çizili oluşturma süreci aynıdır. Ancak, üstü çizili farklı bir uzaklık ve büyük olasılıkla farklı bir genişlik ve kalınlık olacaktır.
Piksel Kenetleme, DIP Başına Piksel ve Dönüştürme
IsPixelSnappingDisabled()
Bu yöntem, piksel tutturma devre dışı olup olmadığını belirlemek için çağrılır. Önerilen varsayılan değer FALSEve bu örnekteki çıktıdır.
*isDisabled = FALSE;
GetCurrentTransform()
Bu örnek bir Direct2D işleme hedefine işlenir, bu nedenle ID2D1RenderTarget::GetTransformkullanarak işleme hedefinden dönüştürmeyi iletin.
//forward the render target's transform
pRT_->GetTransform(reinterpret_cast<D2D1_MATRIX_3X2_F*>(transform));
GetPixelsPerDip()
Bu yöntem, Cihazdan Bağımsız Piksel (DIP) başına piksel sayısını almak için çağrılır.
float x, yUnused;
pRT_->GetDpi(&x, &yUnused);
*pixelsPerDip = x / 96;
DrawInlineObject()
Özel metin işleyicisinin satır içi nesneleri çizmek için bir geri çağırma işlevi de vardır. Bu örnekte, DrawInlineObjectE_NOTIMPL döndürür. Satır içi nesneleri çizmenin açıklaması bu öğreticinin kapsamının dışındadır. Daha fazla bilgi için, Metin Düzenine Satır içi Nesneler Ekleme konusuna bakın.
Yıkıcı
Özel metin işleyici sınıfı tarafından kullanılan tüm işaretçileri serbest bırakmak önemlidir.
CustomTextRenderer::~CustomTextRenderer()
{
SafeRelease(&pD2DFactory_);
SafeRelease(&pRT_);
SafeRelease(&pOutlineBrush_);
SafeRelease(&pFillBrush_);
}
Özel Metin oluşturucu kullanma
Özel çizer ile çizim yapmak için, aşağıdaki kodda gösterildiği gibi, bir geri çağırma arabirimini bağımsız değişken olarak alan IDWriteTextRenderer'den türetilmişile, IDWriteTextLayout::Draw yöntemini kullanmanız gerekir.
// 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öntemlerini çağırır. DrawGlyphRun, DrawUnderline, DrawInlineObjectve DrawStrikethrough yöntemleri çizim işlevlerini gerçekleştirir.