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.
Bu belgede, directwrite ve Direct2D kullanarak tek bir biçim içeren basit metin ve ardından birden çok biçim içeren metinler oluşturma adımları gösterilmektedir.
Bu öğretici aşağıdaki bölümleri içerir:
- Kaynak Kodu
- Basit Metin Çizmeyi
- Birden Çok Biçimli Metin Çizimi .
Kaynak kodu
Bu genel bakışta gösterilen kaynak kodu, DirectWrite Hello World adlıörneğinden alınmıştır. Her bölüm ayrı bir sınıfta (SimpleText ve MultiformattedText) uygulanır ve ayrı bir alt pencerede görüntülenir. Her sınıf bir Microsoft Win32 penceresini temsil eder. WndProc yöntemine ek olarak, her sınıf aşağıdaki yöntemleri içerir:
Fonksiyon | Açıklama |
---|---|
Cihazdan Bağımsız Kaynaklar Oluştur | Cihazdan bağımsız kaynaklar oluşturur, böylece her yerde yeniden kullanılabilirler. |
Cihazdan Bağımsız Kaynakları At | Cihazdan bağımsız kaynakları artık gerekli olmadığında serbest bırakır. |
CreateDeviceResources | Fırçalar ve işleme hedefleri gibi belirli bir cihaza bağlı kaynaklar oluşturur. |
DiscardDeviceResources | Cihaza bağımlı kaynakları artık gerekli olmadığında serbest bırakır. |
DrawD2DContent | Ekrana işlemek için Direct2D kullanır. |
DrawText | Direct2Dkullanarak metin dizesini çizer. |
OnResize | Pencere boyutu değiştirildiğinde Direct2D oluşturma hedefi yeniden boyutlandırılır. |
Sağlanan örneği kullanabilir veya kendi Win32 uygulamanıza DirectWrite ve Direct2D eklemek için aşağıdaki yönergeleri kullanabilirsiniz. Örnek ve ilişkili proje dosyaları hakkında daha fazla bilgi için directwrite HelloWorld bölümüne bakın.
Basit Metin Çizme
Bu bölümde, aşağıdaki ekran görüntüsünde gösterildiği gibi, tek biçimli basit metinleri işlemek için DirectWrite ve Direct2D nasıl kullanılacağı gösterilmektedir.
Ekrana basit metin çizmek için dört bileşen gerekir:
- Görüntülenecek bir karakter dizesi.
- IDWriteTextFormatörneği.
- Metni içerecek alanın boyutları.
- Metni işleyebilen bir nesne. Bu öğreticide. Direct2D işleme hedefi kullanırsınız.
IDWriteTextFormat arabirimi, metni biçimlendirmek için kullanılan yazı tipi ailesi adını, boyutunu, kalınlığını, stilini ve esnetmeyi açıklar ve yerel ayar bilgilerini açıklar. IDWriteTextFormat, aşağıdaki özellikleri ayarlama ve alma yöntemlerini de tanımlar:
- Satır aralığı.
- Düzen kutusunun sol ve sağ kenarlarına göre metin hizalaması.
- Düzen kutusunun üstüne ve altına göre paragraf hizalaması.
- Okuma yönü.
- Düzen kutusuna taşan metnin ayrıntı düzeyini kırpan metin.
- Artımlı sekme durağı.
- Paragraf akış yönü.
IDWriteTextFormat arabirimi, bu belgede açıklanan her iki işlemi de kullanan metin çizmek için gereklidir.
bir IDWriteTextFormat nesnesi veya başka bir DirectWrite nesnesi oluşturabilmeniz için bir IDWriteFactory örneği gerekir. IDWriteTextFormat örnekleri ve diğer DirectWrite nesneleri oluşturmak için IDWriteFactory kullanırsınız. Fabrika örneği almak için DWriteCreateFactory işlevini kullanın.
Bölüm 1: DirectWrite ve Direct2D Kaynaklarını Bildirme.
Bu bölümde, daha sonra metni oluşturmak ve sınıfınızın özel veri üyeleri olarak görüntülemek için kullanacağınız nesneleri bildirirsiniz. DirectWrite için tüm arabirimler, işlevler ve veri türleri dwrite.h üst bilgi dosyasında ve Direct2D için olanlar d2d1.hbildirilir; henüz yapmadıysanız, bu üst bilgileri projenize ekleyin.
Sınıf üst bilgi dosyanızda (SimpleText.h), IDWriteFactory ve IDWriteTextFormat arabirimlerine işaretçileri özel üyeler olarak bildirin.
IDWriteFactory* pDWriteFactory_; IDWriteTextFormat* pTextFormat_;
İşlenmek üzere metin dizesini ve dizenin uzunluğunu tutacak üyeleri bildirin.
const wchar_t* wszText_; UINT32 cTextLength_;
ID2D1Factory, ID2D1HwndRenderTargetve Direct2Dile metni işlemek için ID2D1SolidColorBrusharabirimleriişaretçileri bildirin.
ID2D1Factory* pD2DFactory_; ID2D1HwndRenderTarget* pRT_; ID2D1SolidColorBrush* pBlackBrush_;
Bölüm 2: Cihazdan Bağımsız Kaynaklar oluşturma.
Direct2D iki tür kaynak sağlar: cihaza bağımlı kaynaklar ve cihazdan bağımsız kaynaklar. Cihaza bağımlı kaynaklar bir işleme cihazıyla ilişkilendirilir ve bu cihaz kaldırılırsa artık çalışmaz. Diğer yandan, cihazdan bağımsız kaynaklar uygulamanızın kapsamına kadar sürebilir.
DirectWrite kaynakları cihazdan bağımsızdır.
Bu bölümde, uygulamanız tarafından kullanılan cihazdan bağımsız kaynakları oluşturacaksınız. Bu kaynaklar, arabiriminin Release yöntemine yapılan çağrıyla serbest bırakılmalıdır.
Kullanılan kaynaklardan bazılarının yalnızca bir kez oluşturulması gerekir ve bir cihaza bağlı değildir. Bu kaynaklar için başlatma, sınıfı başlatırken çağrılan SimpleText::CreateDeviceIndependentResources yöntemine konur.
Sınıf uygulama dosyasındaki (SimpleText.cpp) SimpleText::CreateDeviceIndependentResources yönteminin içinde, D2D1CreateFactory işlevini çağırarak tüm Direct2D nesnelerinin kök fabrika arabirimi olan id2D1Factory arabirimini oluşturun. Diğer Direct2D kaynaklarını örneklemek için aynı fabrikayı kullanırsınız.
hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory_ );
Tüm DirectWrite nesnelerinin kök fabrika arabirimi olan IDWriteFactory arabirimi oluşturmak için DWriteCreateFactory işlevini çağırın. Diğer DirectWrite kaynaklarını örneklemek için aynı nesne oluşturucuyu kullanırsınız.
if (SUCCEEDED(hr)) { hr = DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&pDWriteFactory_) ); }
Metin dizesini başlatın ve uzunluğunu depolayın.
wszText_ = L"Hello World using DirectWrite!"; cTextLength_ = (UINT32) wcslen(wszText_);
IDWriteFactory::CreateTextFormat yöntemini kullanarak IDWriteTextFormat arabirim nesnesi oluşturun. IDWriteTextFormat, metin dizesini işlemek için kullanılacak yazı tipini, kalınlığı, esnetmeyi, stili ve yerel ayarı belirtir.
if (SUCCEEDED(hr)) { hr = pDWriteFactory_->CreateTextFormat( L"Gabriola", // Font family name. NULL, // Font collection (NULL sets it to use the system font collection). DWRITE_FONT_WEIGHT_REGULAR, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 72.0f, L"en-us", &pTextFormat_ ); }
IDWriteTextFormat::SetTextAlignmentve IDWriteTextFormat::SetParagraphAlignmentyöntemleriniçağırarak metni yatay ve dikey olarak ortalar.
// Center align (horizontally) the text. if (SUCCEEDED(hr)) { hr = pTextFormat_->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER); } if (SUCCEEDED(hr)) { hr = pTextFormat_->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER); }
Bu bölümde, uygulamanız tarafından kullanılan cihazdan bağımsız kaynakları başlatmışsınız. Sonraki bölümde cihaza bağımlı kaynakları başlatacaksınız.
Bölüm 3: Device-Dependent Kaynaklarını Oluştur.
Bu bölümde, metninizi işlemek için ID2D1HwndRenderTarget ve bir ID2D1SolidColorBrush oluşturacaksınız.
İşleme hedefi, çizim kaynakları oluşturan ve çizim komutlarını bir işleme cihazına işleyen bir Direct2D nesnesidir. ID2D1HwndRenderTarget, bir HWNDüzerine işlem yapan bir işleme hedefidir.
İşleme hedefinin oluşturabileceği çizim kaynaklarından biri, ana hatları, dolguları ve metinleri boyamak için bir fırçadır. ID2D1SolidColorBrush düz bir renkle boyar.
ID2D1HwndRenderTarget ve ID2D1SolidColorBrush arabirimleri, oluşturulduklarında bir işleme cihazına bağlanır ve cihaz geçersiz hale gelirse serbest bırakılıp yeniden oluşturulması gerekir.
SimpleText::CreateDeviceResources yönteminin içinde, işleme hedef işaretçisinin NULLolup olmadığını denetleyin. Bu durumda, işleme alanının boyutunu alın ve bu boyutta bir ID2D1HwndRenderTarget oluşturun. id2D1SolidColorBrusholuşturmak için ID2D1HwndRenderTarget kullanın.
RECT rc; GetClientRect(hwnd_, &rc); D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top); if (!pRT_) { // Create a Direct2D render target. hr = pD2DFactory_->CreateHwndRenderTarget( D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties( hwnd_, size ), &pRT_ ); // Create a black brush. if (SUCCEEDED(hr)) { hr = pRT_->CreateSolidColorBrush( D2D1::ColorF(D2D1::ColorF::Black), &pBlackBrush_ ); } }
SimpleText::DiscardDeviceResources yönteminde hem fırçayı hem de işleme hedefi nesnesini bırakın.
SafeRelease(&pRT_); SafeRelease(&pBlackBrush_);
Artık bir işleme hedefi ve fırça oluşturduğunuza göre, bunları kullanarak metninizi işleyebilirsiniz.
Bölüm 4: Direct2D DrawText Yöntemini Kullanarak Metin Çizin.
Sınıfınızın SimpleText::DrawText yönteminde, işleme alanının boyutlarını alarak metin düzeninin alanını tanımlayın ve aynı boyutlara sahip bir Direct2D dikdörtgen oluşturun.
D2D1_RECT_F layoutRect = D2D1::RectF( static_cast<FLOAT>(rc.left) / dpiScaleX_, static_cast<FLOAT>(rc.top) / dpiScaleY_, static_cast<FLOAT>(rc.right - rc.left) / dpiScaleX_, static_cast<FLOAT>(rc.bottom - rc.top) / dpiScaleY_ );
ID2D1RenderTarget::DrawText yöntemini ve IDWriteTextFormat nesnesini kullanarak metni ekrana işleyin. ID2D1RenderTarget::DrawText yöntemi, aşağıdaki parametreleri alır:
- Render edilecek bir dize.
- IDWriteTextFormat arabirimine yönelik bir işaretçi.
- Direct2D yerleşim dikdörtgeni.
- ID2D1Brushsağlayan bir arabirim işaretçisi.
pRT_->DrawText( wszText_, // The string to render. cTextLength_, // The string's length. pTextFormat_, // The text format. layoutRect, // The region of the window where the text will be rendered. pBlackBrush_ // The brush used to draw the text. );
Bölüm 5: Direct2D Kullanarak Pencere İçeriğini İşleme
Bir boya iletisi alındığında Direct2D kullanarak pencerenin içeriğini işlemek için aşağıdakileri yapın:
- Bölüm 3'te uygulanan SimpleText::CreateDeviceResources yöntemini çağırarak cihaza bağımlı kaynakları oluşturun.
- İşleme hedefinin ID2D1HwndRenderTarget::BeginDraw yöntemini çağırın.
- ID2D1HwndRenderTarget::Clear yöntemini çağırarak işleme hedefini temizleyin.
- Bölüm 4'te uygulanan SimpleText::DrawText yöntemini çağırın.
- İşleme hedefinin ID2D1HwndRenderTarget::EndDraw yöntemini çağırın.
- Gerekirse, pencere yeniden çizildiğinde yeniden oluşturulabilmeleri için cihaza bağımlı kaynakları atın.
hr = CreateDeviceResources();
if (SUCCEEDED(hr))
{
pRT_->BeginDraw();
pRT_->SetTransform(D2D1::IdentityMatrix());
pRT_->Clear(D2D1::ColorF(D2D1::ColorF::White));
// Call the DrawText method of this class.
hr = DrawText();
if (SUCCEEDED(hr))
{
hr = pRT_->EndDraw(
);
}
}
if (FAILED(hr))
{
DiscardDeviceResources();
}
SimpleText sınıfı SimpleText.h ve SimpleText.cpp'da uygulanır.
Birden Çok Biçimli Metin Yazma.
Bu bölümde, aşağıdaki ekran görüntüsünde gösterildiği gibi DirectWrite ve Direct2D kullanarak birden çok biçimli metin işleme adımları gösterilmektedir.
Bu bölümün kodu, DirectWrite HelloWorldMultiformattedText sınıfı olarak uygulanır. Önceki bölümde yer alan adımları temel alır.
Çok biçimlendirilmiş metin oluşturmak için, önceki bölümde tanıtılan IDWriteTextFormat arabirimine ek olarak IDWriteTextLayout arabirimini de kullanırsınız. IDWriteTextLayout arabirimi, bir metin bloğunun biçimlendirmesini ve düzenini açıklar. IDWriteTextFormat nesnesi tarafından belirtilen varsayılan biçimlendirmeye ek olarak, belirli metin aralıklarının biçimlendirmesi IDWriteTextLayoutkullanılarak değiştirilebilir. Buna yazı tipi ailesi adı, boyutu, kalınlığı, stili, esnetme, üstü çizili ve altı çizili de dahildir.
IDWriteTextLayout isabet testi yöntemleri de sağlar. Bu yöntemler tarafından döndürülen isabet testi ölçümleri, IDWriteTextLayout arabirimi nesnesi, IDWriteFactory arabiriminin CreateTextLayout yöntemi kullanılarak oluşturulduğunda belirtilen düzen kutusuna göre belirlenir.
IDWriteTypography arabirimi, bir metin düzenine swashes ve alternatif stil metin kümeleri gibi isteğe bağlı OpenType tipografi özellikleri eklemek için kullanılır. Tipografik özellikler, IDWriteTypography arabiriminin AddFontFeature yöntemi çağrılarak metin düzenindeki belirli bir metin aralığına eklenebilir. Bu yöntem, DWRITE_FONT_FEATURE_TAG numaralandırma sabiti ve UINT32 yürütme parametresi içeren bir parametre olarak DWRITE_FONT_FEATURE yapısını alır. Kayıtlı OpenType özelliklerinin listesi, microsoft.com'daki OpenType Düzen Etiketi Kayıt Defteri'de bulunabilir. Karşılık gelen DirectWrite numaralandırma sabitleri için bkz. DWRITE_FONT_FEATURE_TAG.
Bölüm 1: IDWriteTextLayout Arabirimi oluşturun.
IDWriteTextLayout arabirimine bir işaretçiyi MultiformattedText sınıfının bir üyesi olarak bildirin.
IDWriteTextLayout* pTextLayout_;
MultiformattedText::CreateDeviceIndependentResources yönteminin sonunda, CreateTextLayout yöntemini çağırarak bir IDWriteTextLayout arabirim nesnesi oluşturun. IDWriteTextLayout arabirimi, metnin seçili bölümlerine farklı biçimler uygulama gibi ek biçimlendirme özellikleri sağlar.
// Create a text layout using the text format. if (SUCCEEDED(hr)) { RECT rect; GetClientRect(hwnd_, &rect); float width = rect.right / dpiScaleX_; float height = rect.bottom / dpiScaleY_; hr = pDWriteFactory_->CreateTextLayout( wszText_, // The string to be laid out and formatted. cTextLength_, // The length of the string. pTextFormat_, // The text format to apply to the string (contains font information, etc). width, // The width of the layout box. height, // The height of the layout box. &pTextLayout_ // The IDWriteTextLayout interface pointer. ); }
Bölüm 2: IDWriteTextLayout ile Biçimlendirme Uygulama.
Yazı tipi boyutu, kalınlığı ve altı çizili gibi biçimlendirme, IDWriteTextLayout arabirimi kullanılarak görüntülenecek metnin alt dizelerine uygulanabilir.
DWRITE_TEXT_RANGE bildirerek ve IDWriteTextLayout::SetFontSizeyöntemini çağırarak "DirectWrite" alt dizesinin "Di" alt dizesinin yazı tipi boyutunu 100 olarak ayarlayın.
// Format the "DirectWrite" substring to be of font size 100. if (SUCCEEDED(hr)) { DWRITE_TEXT_RANGE textRange = {20, // Start index where "DirectWrite" appears. 6 }; // Length of the substring "Direct" in "DirectWrite". hr = pTextLayout_->SetFontSize(100.0f, textRange); }
IDWriteTextLayout::SetUnderline yöntemini çağırarak "DirectWrite" alt dizesinin altını çizin.
// Format the word "DWrite" to be underlined. if (SUCCEEDED(hr)) { DWRITE_TEXT_RANGE textRange = {20, // Start index where "DirectWrite" appears. 11 }; // Length of the substring "DirectWrite". hr = pTextLayout_->SetUnderline(TRUE, textRange); }
IDWriteTextLayout::SetFontWeight yöntemini çağırarak "DirectWrite" alt dizesi için yazı tipi kalınlığını kalın olarak ayarlayın.
if (SUCCEEDED(hr)) { // Format the word "DWrite" to be bold. DWRITE_TEXT_RANGE textRange = {20, 11 }; hr = pTextLayout_->SetFontWeight(DWRITE_FONT_WEIGHT_BOLD, textRange); }
Bölüm 3: IDWriteTypography ile Tipografi Özellikleri Ekleme.
IDWriteFactory::CreateTypography yöntemini çağırarak IDWriteTypography arabirim nesnesi bildirin ve oluşturun.
// Declare a typography pointer. IDWriteTypography* pTypography = NULL; // Create a typography interface object. if (SUCCEEDED(hr)) { hr = pDWriteFactory_->CreateTypography(&pTypography); }
Stil kümesi 7 belirtilmiş bir DWRITE_FONT_FEATURE nesnesi bildirerek ve IDWriteTypography::AddFontFeature yöntemini çağırarak yazı tipi özelliği ekleyin.
// Set the stylistic set. DWRITE_FONT_FEATURE fontFeature = {DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7, 1}; if (SUCCEEDED(hr)) { hr = pTypography->AddFontFeature(fontFeature); }
Tipografiyi tüm metin dizisine uygulamak için bir DWRITE_TEXT_RANGE değişkeni bildirip ve metin aralığını geçirerek IDWriteTextLayout::SetTypography yöntemini çağırarak metin düzenini ayarlayın.
if (SUCCEEDED(hr)) { // Set the typography for the entire string. DWRITE_TEXT_RANGE textRange = {0, cTextLength_}; hr = pTextLayout_->SetTypography(pTypography, textRange); }
MultiformattedText::OnResize yönteminde metin düzeni nesnesinin yeni genişliğini ve yüksekliğini ayarlayın.
if (pTextLayout_) { pTextLayout_->SetMaxWidth(static_cast<FLOAT>(width / dpiScaleX_)); pTextLayout_->SetMaxHeight(static_cast<FLOAT>(height / dpiScaleY_)); }
Bölüm 4: Direct2D DrawTextLayout Yöntemini Kullanarak Metin Çizin.
IDWriteTextLayout nesnesi tarafından belirtilen metin düzeni ayarlarıyla metin çizmek için, MultiformattedText::DrawText yöntemindeki kodu IDWriteTextLayout::DrawTextLayoutkullanacak şekilde değiştirin.
bir D2D1_POINT_2F değişkeni bildirin ve pencerenin sol üst noktasına ayarlayın.
D2D1_POINT_2F origin = D2D1::Point2F( static_cast<FLOAT>(rc.left / dpiScaleX_), static_cast<FLOAT>(rc.top / dpiScaleY_) );
ID2D1RenderTarget::DrawTextLayout yöntemini çağırarak ve IDWriteTextLayout işaretçisini geçirerek Direct2D render hedefi ile metni ekrana çizin.
pRT_->DrawTextLayout( origin, pTextLayout_, pBlackBrush_ );
MultiformattedText sınıfı MultiformattedText.h ve MultiformattedText.cpp'da uygulanır.