Aracılığıyla paylaş


DirectWrite ile tanışın

İnsanlar günlük yaşamlarında sürekli metinle iletişim kurarlar. Bu, insanların artan miktarda bilgiyi tüketmesinin birincil yoludur. Eskiden basılı içerikler, öncelikle belgeler, gazeteler, kitaplar vb. aracılığıyla yapılırdı. Giderek daha fazla, kullanıcılar çevrimiçi içeriği Windows bilgisayarlarında tüketiyor. Tipik bir Windows kullanıcısı bilgisayar ekranından okumak için çok zaman harcar. Web'de geziniyor, e-postayı tarıyor, rapor oluşturuyor, elektronik tablo dolduruyor veya yazılım yazıyor olabilirler, ancak asıl yaptıkları şey okumaktır. Metinler ve yazı tipleri Windows'taki kullanıcı deneyiminin neredeyse her parçasına geçirilse de, çoğu kullanıcı için ekranda okuma, yazdırılan çıktıyı okumak kadar eğlenceli değildir.

Windows uygulama geliştiricileri için, daha iyi okunabilirlik, gelişmiş biçimlendirme ve düzen denetimi gereksinimlerinin artması ve uygulamanın görüntülemesi gereken birden çok dil için destek nedeniyle metin işleme kodu yazmak zor bir işlemdir. En temel metin işleme sistemi bile metin giriş, düzen, görüntüleme, düzenleme ve kopyalama ve yapıştırma işlemlerine izin vermelidir. Windows kullanıcıları genellikle bu temel özelliklerden daha fazlasını bekler ve basit düzenleyicilerin bile birden çok yazı tipini, çeşitli paragraf stillerini, ekli resimleri, yazım denetimini ve diğer özellikleri desteklemesini gerektirmektedir. Modern kullanıcı arabirimi tasarımı artık tek biçimli, düz metinle sınırlı değildir, ancak zengin yazı tipleri ve metin düzenleriyle daha iyi bir deneyim sunması gerekir.

Bu, DirectWrite'nin Windows uygulamalarının kullanıcı arabirimi ve belgeler için metin deneyimini nasıl geliştireceklerini gösteren bir giriş niteliğindedir.

Metin Deneyimini Geliştirme

Modern Windows uygulamalarının kullanıcı arabirimi ve belgelerindeki metinler için gelişmiş gereksinimleri vardır. Bunlar arasında daha iyi okunabilirlik, çok çeşitli diller ve betikler için destek ve üstün işleme performansı bulunur. Ayrıca, mevcut uygulamaların çoğu WindowsWin32 kod tabanında mevcut yatırımları gerçekleştirmek için bir yol gerektirir.

DirectWrite, Windows uygulama geliştiricilerinin uygulamalarındaki metin deneyimini geliştirmelerini sağlayan aşağıdaki üç özelliği sağlar: işleme sisteminden bağımsızlığı, yüksek kaliteli tipografi ve birden çok işlev katmanı.

Rendering-System Bağımsızlık

DirectWrite herhangi bir grafik teknolojisinden bağımsızdır. Uygulamalar, ihtiyaçlarına en uygun işleme teknolojisini kullanmakta serbesttir. Bu, uygulamalara uygulamalarının bazı bölümlerini GDI ve diğer bölümlerini Direct3D veya Direct2Daracılığıyla işlemeye devam etme esnekliği sağlar. Aslında, bir uygulama özel bir işleme yığını aracılığıyla DirectWrite'i işlemeyi seçebilir.

High-Quality Tipografi

DirectWrite, Bir Windows uygulamasında yüksek kaliteli tipografiyi etkinleştirmek için OpenType Yazı Tipi teknolojisinin ilerlemelerinden yararlanır. DirectWrite yazı tipi sistemi, yazı tiplerini işlemek için uygulamaların ihtiyaç duyduğu yazı tipi numaralandırması, yazı tipi geri dönüşü ve yazı tipi önbelleğe alma işlemlerine yönelik hizmetler sağlar.

DirectWrite tarafından sağlanan OpenType desteği, geliştiricilerin uygulamalarına gelişmiş tipografi özellikleri eklemesine ve uluslararası metin desteğine olanak tanır.

Gelişmiş Tipografi Özellikleri desteği

DirectWrite, uygulama geliştiricilerinin WinForms veya GDI'da kullanamadıkları OpenType yazı tiplerinin özelliklerinin kilidini açmasına olanak tanır. DirectWrite IDWriteTypography nesnesi, OpenType yazı tiplerinin stil alternatifleri ve harf süslemeleri gibi birçok gelişmiş özelliğini kullanıma sunar. Microsoft Windows Yazılım Geliştirme Seti (SDK), Pericles ve Pescadero yazı tipleri gibi zengin özelliklerle tasarlanmış bir dizi örnek OpenType yazı tipi sağlar. OpenType özellikleri hakkında daha fazla bilgi için bkz. OpenType Yazı Tipi Özellikleri.

Uluslararası Metin Desteği Sağlama

DirectWrite, uluslararası metinler için geniş destek sağlamak için OpenType yazı tiplerini kullanır. Vekiller, BIDI, satır kesme ve UVS gibi Unicode özellikleri desteklenir. Dil destekli betik öğeleştirmesi, numara değiştirme ve glif şekillendirme, herhangi bir betikteki metnin doğru düzene ve işlemeye sahip olmasını sağlar.

Şu anda aşağıdaki betikler desteklenmektedir:

Not

* ile işaretlenmiş betikler için varsayılan sistem yazı tipi yoktur. Uygulamaların bu betikleri destekleyen yazı tiplerini yüklemesi gerekir.

 

  • Arapça
  • Ermenice
  • Bengala
  • Bopomofo
  • Braille*
  • Kanada yerli hece yazısı
  • Cherokee
  • Çince (Basitleştirilmiş & Geleneksel)
  • Kiril alfabesi
  • Kıpti*
  • Devanagari
  • Etiyopik
  • Gürcüce
  • Glagolitic*
  • Yunanca
  • Guceratça
  • Gürmukhi
  • İbranice
  • Japonca
  • Kannada dili
  • Khmer
  • Kore dili
  • Lao
  • Latince
  • Malayalam dili
  • Moğolca
  • Myanmar
  • Yeni Tai Lue
  • Ogham*
  • Odiya
  • 'Phags-pa
  • Runik*
  • Sinhala dili
  • Süryanice
  • Tai Le
  • Tamil dili
  • Telugu dili
  • Thaana
  • Tay dili
  • Tibetli
  • Yi

Birden Çok İşlevsellik Katmanı

DirectWrite, her katmanın bir sonraki katmanla sorunsuz bir şekilde etkileşim kurması için faktörlü işlevsellik katmanları sağlar. API tasarımı, uygulama geliştiricilerine ihtiyaçlarına ve zamanlamalarına bağlı olarak tek tek katmanları benimseme özgürlüğü ve esnekliği sağlar. Aşağıdaki diyagramda bu katmanlar arasındaki ilişki gösterilmektedir.

Doğrudan yazma katmanlarının diyagramı ve bir uygulama veya kullanıcı arabirimi çerçevesiyle ve grafiksel API ile nasıl iletişim kurduklarını

Metin düzeni API'DirectWriteile kullanılabilen en üst düzey işlevselliği sağlar. Uygulamanın zengin biçimlendirilmiş metin dizelerini ölçmesi, görüntülemesi ve bunlarla etkileşim kurması için hizmetler sağlar. Bu metin API'sini şu anda Win32'nin DrawText'ini kullanan uygulamalarda zengin biçimlendirilmiş metinlerle modern bir kullanıcı arabirimi oluşturmak için kullanılabilir.

Düzen altyapısını kendisi uygulayan yazı yoğunluklu uygulamalar, bir alt katmanı kullanabilir: yazı işlemcisi. Betik işlemcisi bir metin öbeğini betik bloklarına ayırır ve Unicode gösterimleri arasındaki eşlemeyi yazı tipindeki uygun karakter gösterimine işler, böylece betiğin metni doğru dilde doğru şekilde görüntülenebilir. Metin düzenleme API katmanı tarafından kullanılan düzen sistemi, yazı tipi ve script işleme sistemine dayanır.

Glif işleme katmanı en düşük işlevsellik katmanıdır ve kendi metin düzeni altyapısını uygulayan uygulamalar için glif işleme işlevselliği sağlar. Glif işleme katmanı, DirectWrite metin biçimlendirme API'sindeki geri çağırma işlevi aracılığıyla glif çizim davranışını değiştirmek için özel işleyici uygulayan uygulamalar için de kullanışlıdır.

DirectWrite yazı tipi sistemi tüm DirectWrite işlevsel katmanları tarafından kullanılabilir ve bir uygulamanın yazı tipi ve karakter bilgilerine erişmesini sağlar. Yaygın yazı tipi teknolojilerini ve veri biçimlerini işlemek için tasarlanmıştır. DirectWrite yazı tipi modeli, aynı yazı tipi ailesindeki herhangi bir sayıda ağırlığı, stili ve esnetmeyi desteklemeye yönelik yaygın tipografik uygulamayı izler. WPF ve CSS'nin izlediği model olan bu model, yalnızca kalınlık (kalın, hafif vb.), stil (dik, italik veya eğik) veya esnetme (dar, sıkıştırılmış, geniş vb.) bakımından farklılık gösteren yazı tiplerinin tek bir yazı tipi ailesinin üyesi olarak kabul edildiğini belirtir.

ClearType ile Geliştirilmiş Metin İşleme

Ekranda okunabilirliği geliştirmek, tüm Windows uygulamaları için önemli bir gereksinimdir. Bilişsel psikolojideki araştırmalardan elde ettiğimiz kanıtlar, her harfi doğru tanıyabilmemiz gerektiğini ve harfler arasındaki aralığın bile hızlı işleme için kritik öneme sahip olduğunu göstermektedir. Simetrik olmayan harfler ve sözcükler çirkin olarak algılanıp okuma deneyimini düşürür. Microsoft Advanced Reading Technologies grubu Kevin Larson, Spectrum IEEE'de yayımlanan konuyla ilgili bir makale yazdı. Makalenin adı "Metin Teknolojisi".

DirectWrite metin Microsoft ClearType kullanılarak işlenir ve bu da metnin netliğini ve okunabilirliğini artırır. ClearType, modern LCD ekranların ayrı ayrı kontrol edilebilen her piksel için RGB şeritlere sahip olmasından yararlanır. DirectWrite, ilk olarak Windows Vista ve Windows Presentation Foundation ile birlikte gelen ClearType'a yönelik en son geliştirmeleri kullanır ve bu sayede yalnızca tek tek harfleri değil, aynı zamanda harfler arasındaki aralığı da değerlendirebilir. Bu ClearType geliştirmelerinden önce, "okuma" boyutu 10 veya 12 nokta olan metnin görüntülenmesi zordu: harflerin arasına genellikle çok az olan 1 piksel veya genellikle çok fazla olan 2 piksel yerleştirebiliyoruz. Alt piksellerdeki ek çözünürlüğün kullanılması, sayfanın tamamının eşitliğini ve simetrisini geliştiren kesirli aralık sağlar.

Aşağıdaki iki çizimde, alt piksel konumlandırma kullanıldığında herhangi bir alt piksel sınırında gliflerin nasıl başlatılabileceğini gösterilmektedir.

Aşağıdaki çizim, alt piksel konumlandırması kullanmayan ClearType işleyicisinin GDI sürümü kullanılarak işlenir.

Aşağıdaki çizim, ClearType işleyicisinin alt piksel konumlandırma kullanan DirectWrite sürümü kullanılarak işlenir.

"Teknoloji"nin alt piksel konumlandırma ile işlenmiş çizimi

h ve n harfleri arasındaki aralığın ikinci resimde daha eşit olduğunu ve o harfinin n harfinden daha uzak olduğunu, l harfiyle daha eşit mesafede durduğunu unutmayın. Ayrıca "l" harflerinin üzerindeki sapların nasıl daha doğal göründüğünü de not edin.

Alt piksel ClearType konumlandırması, özellikle bir alt piksel ile bir pikselin tamamı arasındaki farkın karakter genişliğinin önemli bir oranını temsil ettiği küçük boyutlarda, ekranda en doğru karakter aralığını sunar. Metnin ideal çözünürlük alanında ölçülerek LCD renk şeridinde doğal konumunda, alt piksel tanecikliğiyle işlenmesini sağlar. Bu teknoloji kullanılarak ölçülen ve işlenen metin, tanım gereği çözünürlükte bağımsızdır, yani çeşitli görüntü çözünürlükleri aralığında tam olarak aynı metin düzeni elde edilir.

Her iki GDI ClearType işleme türünden farklı olarak, alt piksel ClearType en doğru karakter genişliğini sunar.

Metin Dizesi API'si varsayılan olarak alt piksel metin işlemeyi benimser; bu da metni geçerli görüntü çözünürlüğünden bağımsız olarak ideal çözünürlüğünde ölçer ve gerçekten ölçeklendirilmiş glif ilerleme genişliklerine ve konumlandırma uzaklıklarına göre glif konumlandırma sonucunu üretir.

Büyük boyutlu metinler için DirectWrite , kenarları daha yumuşak hale getirmek ve yazı tipi tasarımcısının istediği gibi harfleri işlemek için y ekseni boyunca kenar yumuşatma özelliğini de etkinleştirir. Aşağıdaki çizimde y yönlü kenar yumuşatma gösterilmektedir.

DirectWrite metni varsayılan olarak alt piksel ClearType kullanılarak konumlandırılmış ve işlenmiş olsa da, diğer işleme seçenekleri kullanılabilir. Mevcut uygulamaların çoğu kullanıcı arabirimini işlemek için GDI kullanır ve bazı uygulamalar metin işleme için GDI kullanmaya devam eden sistem düzenleme denetimlerini kullanır. Bu uygulamalara DirectWrite metni eklerken, metnin uygulama genelinde tutarlı bir görünüme sahip olması için alt piksel ClearType tarafından sağlanan okuma deneyimi geliştirmelerini feda etmek gerekebilir.

Bu gereksinimleri karşılamak için DirectWrite aşağıdaki işleme seçeneklerini de destekler:

  • Alt piksel ClearType (varsayılan).
  • Hem yatay hem de dikey boyutlarda kenar yumuşatma ile alt piksel ClearType.
  • Takma isimli metin.
  • GDI doğal genişlik (örneğin, Microsoft Word Okuma Görünümü tarafından kullanılır).
  • GDI uyumlu genişlik (Doğu Asya gömülü bit eşlem dahil).

Bu işleme modlarının her biri DirectWrite API'sinde ve yeni Windows 7 gelen kutusu ClearType tarayıcısında ince ayar yapılabilir.

Not

Windows 8'den başlayarak, çoğu durumda gri tonlamalı metin dengeleme kullanmalısınız. Daha fazla bilgi için sonraki bölüme bakın.

 

Doğal Düzen desteği

Doğal düzen çözünürlükten bağımsızdır, bu nedenle siz yakınlaştırdıkça veya uzaklaştırdıkça ya da ekranın DPI'sine bağlı olarak karakter aralığı değişmez. İkincil bir avantajı, aralığın yazı tipinin tasarımı için doğru olmasıdır. Doğal düzen, DirectWrite'in doğal işleme desteğiyle mümkün hale getirilir, yani tek tek glifler pikselin bir bölümüne konumlandırılabilir.

Varsayılan olarak doğal düzen olsa da, bazı uygulamaların metni GDI ile aynı aralık ve görünümde işlemesi gerekir. DirectWrite, bu tür uygulamalar için GDI klasik ve GDI doğal ölçüm modları ve buna karşılık gelen işleme modları sağlar.

Yukarıdaki işleme modlarından herhangi biri iki dengeleme modundan biriyle birleştirilebilir: ClearType veya gri tonlamalı. ClearType antialiasing, her pikselin kırmızı, yeşil ve mavi renk değerlerini tek tek düzenleyerek daha yüksek bir çözünürlük simülasyonu oluşturur. Gri tonlamalı dengeleme, her piksel için yalnızca bir kapsam (veya alfa) değeri hesaplar. ClearType varsayılandır, ancak windows mağazası uygulamaları için gri tonlamalı antialiasing önerilir çünkü daha hızlıdır ve standart antialiasing ile uyumludur, ancak yine de yüksek oranda okunabilir durumdadır.

API'ye Genel Bakış

IDWriteFactory arabirimi, DirectWrite işlevini kullanmaya yönelik başlangıç noktasıdır. Fabrika, birlikte kullanılabilecek bir nesne kümesi oluşturan kök nesnedir.

Metnin çizilmeden veya isabetle test edilmeden önce düzgün biçimlendirilmesi ve belirli bir kısıtlama kümesine yerleştirilmesi gerektiğinden, biçimlendirme ve düzen işlemi işlemlerin önkoşullarından biridir. Bu amaçla IDWriteFactory ile oluşturabileceğiniz iki anahtar nesne, IDWriteTextFormatve IDWriteTextLayout. IDWriteTextFormat nesnesi, bir metin paragrafının biçimlendirme bilgilerini temsil eder. IDWriteFactory::CreateTextLayout işlevi giriş dizesini, doldurulacak alanın boyutu gibi ilişkili kısıtlamaları ve IDWriteTextFormat nesnesini alır ve tam olarak çözümlenmiş ve biçimlendirilmiş sonucu sonraki işlemlerde kullanmak üzere IDWriteTextLayout yerleştirir.

Uygulama daha sonra Direct2D tarafından sağlanan DrawTextLayout işlevini kullanarak veya glifleri işlemek için GDI, Direct2D veya diğer grafik sistemlerini kullanabilen bir geri çağırma işlevi uygulayarak metni işleyebilir. Direct2D üzerindeki DrawText işlevi, önce IDWriteTextLayout nesnesi oluşturmak zorunda kalmadan metin çizmek için daha basit bir yol sağlar.

DirectWrite Kullanarak "Merhaba Dünya" Biçimlendirme ve Çizim

Aşağıdaki kod örneğinde, uygulamanın IDWriteTextFormatkullanarak tek bir paragrafı nasıl biçimlendirebileceği ve Direct2DDrawText işlevini kullanarak nasıl çizebileceği gösterilmektedir.

HRESULT DemoApp::DrawHelloWorld(
    ID2D1HwndRenderTarget* pIRenderTarget
    )
{
    HRESULT hr = S_OK;
    ID2D1SolidColorBrush* pIRedBrush = NULL;
    IDWriteTextFormat* pITextFormat = NULL;
    IDWriteFactory* pIDWriteFactory = NULL;

    if (SUCCEEDED(hr))
    {
        hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
                __uuidof(IDWriteFactory),
                reinterpret_cast<IUnknown**>(&pIDWriteFactory));
    }

    if(SUCCEEDED(hr))
    {
        hr = pIDWriteFactory->CreateTextFormat(
            L"Arial", 
            NULL,
            DWRITE_FONT_WEIGHT_NORMAL, 
            DWRITE_FONT_STYLE_NORMAL, 
            DWRITE_FONT_STRETCH_NORMAL, 
            10.0f * 96.0f/72.0f, 
            L"en-US", 
            &pITextFormat
        );
    }

    if(SUCCEEDED(hr))
    {
        hr = pIRenderTarget->CreateSolidColorBrush(
            D2D1:: ColorF(D2D1::ColorF::Red),
            &pIRedBrush
        );
    }
    
   D2D1_RECT_F layoutRect = D2D1::RectF(0.f, 0.f, 100.f, 100.f);

    // Actually draw the text at the origin.
    if(SUCCEEDED(hr))
    {
        pIRenderTarget->DrawText(
            L"Hello World",
            wcslen(L"Hello World"),
            pITextFormat,
            layoutRect, 
            pIRedBrush
        );
    }

    // Clean up.
    SafeRelease(&pIRedBrush);
    SafeRelease(&pITextFormat);
    SafeRelease(&pIDWriteFactory);

    return hr;
}

Yazı Tipi Sistemine Erişme

Yukarıdaki örnekte IDWriteTextFormat arabirimini kullanarak metin dizesi için bir yazı tipi ailesi adı belirtmeye ek olarak, DirectWrite uygulamalara yazı tipi numaralandırması aracılığıyla yazı tipi seçimi üzerinde daha fazla denetim ve katıştırılmış belge yazı tiplerini temel alan özel yazı tipi koleksiyonu oluşturma olanağı sağlar.

IDWriteFontCollection nesnesi, yazı tipi aileleri koleksiyonudur. DirectWrite, sistem yazı tipi koleksiyonu adı verilen özel bir yazı tipi koleksiyonu aracılığıyla sistemde yüklü yazı tipleri kümesine erişim sağlar. Bu, IDWriteFactory nesnesinin GetSystemFontCollection yöntemi çağrılarak elde edilir. Bir uygulama, uygulama tarafından tanımlanan bir geri çağırma tarafından numaralandırılan bir yazı tipi kümesinden, yani bir uygulama tarafından yüklenen özel yazı tiplerinden veya belgeye eklenmiş yazı tiplerinden özel bir yazı tipi koleksiyonu da oluşturabilir.

Uygulama daha sonra koleksiyondaki belirli bir FontFamily nesnesine ulaşmak için GetFontFamilyçağırabilir ve ardından idwriteFontFamily::GetFirstMatchingFontçağırarak belirli bir IDWriteFont nesnesine ulaşabilir. IDWriteFont nesnesi, yazı tipi koleksiyonundaki bir yazı tipini temsil eder ve özellikleri ve birkaç temel yazı tipi ölçümünü kullanıma sunar.

IDWriteFontFace, yazı tipini temsil eden ve bir yazı tipi üzerinde tam ölçüm kümesini kullanıma sunan başka bir nesnedir. IDWriteFontFace doğrudan bir yazı tipi adından oluşturulabilir; bir uygulamanın erişmek için bir yazı tipi koleksiyonu alması gerekmez. Belirli bir yazı tipinin ayrıntılarını sorgulaması gereken Microsoft Word gibi bir metin düzeni uygulaması için kullanışlıdır.

Aşağıdaki diyagramda bu nesneler arasındaki ilişki gösterilmektedir.

Yazı tipi koleksiyonu, yazı tipi ailesi ve yazı tipi yüzü arasındaki ilişkinin diyagramını

IDWriteFontFace

IDWriteFontFace nesnesi bir yazı tipini temsil eder ve IDWriteFont nesnesine göre yazı tipi hakkında daha ayrıntılı bilgi sağlar. IDWriteFontFace yazı tipi ve karakter ölçümleri, metin düzeni uygulayan uygulamalar için kullanışlıdır.

Çoğu temel uygulama bu API'leri doğrudan kullanmaz ve bunun yerine IDWriteFont kullanır veya yazı tipi ailesi adını doğrudan belirtir.

Aşağıdaki tabloda iki nesne için kullanım senaryoları özetlemektedir.

Kategori IDWriteFont IDWriteFontFace
Yazı tipi seçici kullanıcı arabirimi gibi kullanıcı etkileşimlerini destekleyen API'ler: açıklama ve diğer bilgilendirici API'ler Evet Hayır
Yazı tipi eşlemesini destekleyen API'ler: aile, stil, ağırlık, esnetme, karakter kapsamı Evet Hayır
DrawText API Evet Hayır
İşleme için kullanılan API'ler Hayır Evet
Metin düzeni için kullanılan API'ler: karakter ölçümleri vb. Hayır Evet
Kullanıcı arabirimi denetimi ve metin düzeni için API'ler: yazı tipi genelinde ölçümler Evet Evet

 

Aşağıda, sistem yazı tipi koleksiyonundaki yazı tiplerini numaralandıran örnek bir uygulama verilmiştir.

#include <dwrite.h>
#include <string.h>
#include <stdio.h>
#include <new>

// SafeRelease inline function.
template <class T> inline void SafeRelease(T **ppT)
{
    if (*ppT)
    {
        (*ppT)->Release();
        *ppT = NULL;
    }
}

void wmain()
{
    IDWriteFactory* pDWriteFactory = NULL;

    HRESULT hr = DWriteCreateFactory(
            DWRITE_FACTORY_TYPE_SHARED,
            __uuidof(IDWriteFactory),
            reinterpret_cast<IUnknown**>(&pDWriteFactory)
            );

    IDWriteFontCollection* pFontCollection = NULL;

    // Get the system font collection.
    if (SUCCEEDED(hr))
    {
        hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
    }

    UINT32 familyCount = 0;

    // Get the number of font families in the collection.
    if (SUCCEEDED(hr))
    {
        familyCount = pFontCollection->GetFontFamilyCount();
    }

    for (UINT32 i = 0; i < familyCount; ++i)
    {
        IDWriteFontFamily* pFontFamily = NULL;

        // Get the font family.
        if (SUCCEEDED(hr))
        {
            hr = pFontCollection->GetFontFamily(i, &pFontFamily);
        }

        IDWriteLocalizedStrings* pFamilyNames = NULL;
        
        // Get a list of localized strings for the family name.
        if (SUCCEEDED(hr))
        {
            hr = pFontFamily->GetFamilyNames(&pFamilyNames);
        }

        UINT32 index = 0;
        BOOL exists = false;
        
        wchar_t localeName[LOCALE_NAME_MAX_LENGTH];

        if (SUCCEEDED(hr))
        {
            // Get the default locale for this user.
            int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH);

            // If the default locale is returned, find that locale name, otherwise use "en-us".
            if (defaultLocaleSuccess)
            {
                hr = pFamilyNames->FindLocaleName(localeName, &index, &exists);
            }
            if (SUCCEEDED(hr) && !exists) // if the above find did not find a match, retry with US English
            {
                hr = pFamilyNames->FindLocaleName(L"en-us", &index, &exists);
            }
        }
        
        // If the specified locale doesn't exist, select the first on the list.
        if (!exists)
            index = 0;

        UINT32 length = 0;

        // Get the string length.
        if (SUCCEEDED(hr))
        {
            hr = pFamilyNames->GetStringLength(index, &length);
        }

        // Allocate a string big enough to hold the name.
        wchar_t* name = new (std::nothrow) wchar_t[length+1];
        if (name == NULL)
        {
            hr = E_OUTOFMEMORY;
        }

        // Get the family name.
        if (SUCCEEDED(hr))
        {
            hr = pFamilyNames->GetString(index, name, length+1);
        }
        if (SUCCEEDED(hr))
        {
            // Print out the family name.
            wprintf(L"%s\n", name);
        }

        SafeRelease(&pFontFamily);
        SafeRelease(&pFamilyNames);

        delete [] name;
    }

    SafeRelease(&pFontCollection);
    SafeRelease(&pDWriteFactory);
}

Metin işleme

Metin işleme API'leri, DirectWrite yazı tipindeki gliflerin Direct2D yüzeyine veya GDI cihazından bağımsız bit eşlemlere işlenmesini ya da ana hatlara veya bit eşlemlere dönüştürülmesini sağlar. DirectWrite'teki ClearType işlemesi, Windows'taki önceki uygulamalara kıyasla gelişmiş netlik ve karşıtlık ile alt piksel konumlandırmayı destekler. DirectWrite, Doğu Asya yazı tipleri ile gömülü bitmap içeren senaryolar veya kullanıcının herhangi bir türde yazı düzeltmeyi devre dışı bıraktığı senaryoları desteklemek için kenarlı siyah-beyaz metinleri de destekler.

Tüm seçenekler, yeni Windows 7 ClearType ayarlayıcı kontrol paneli uygulaması aracılığıyla sağlanan ve DirectWrite API'leri üzerinden erişilebilen tüm ClearType ayar düğmeleriyle ayarlanabilir.

Glifleri işlemek için iki API mevcuttur: Biri Direct2D aracılığıyla donanım hızlandırmalı işleme sağlar, diğeri ise GDI bit eşlemi için yazılım işleme sağlar. IDWriteTextLayout kullanan ve IDWriteTextRenderer geri çağırmayı uygulayan bir uygulama, DrawGlyphRun geri çağırmaya yanıt olarak bu işlevlerden birini çağırabilir. Ayrıca, kendi düzenini uygulayan veya glif düzeyindeki verilerle ilgilenen uygulamalar bu API'leri kullanabilir.

  1. ID2DRenderTarget::DrawGlyphRun

    Uygulamalar, GPU kullanarak metin işleme için donanım hızlandırma sağlamak üzere DrawGlyphRunDirect2D API'sini kullanabilir. Donanım hızlandırma, metin işleme işlem hattının tüm aşamalarını etkiler: glifleri glif çalıştırmalarına birleştirme, glif çalıştırma bit eşlemini filtreleme ve ClearType karıştırma algoritmasını son görüntülenen çıkışa uygulama. Bu, en iyi işleme performansını elde için önerilen API'dir.

  2. IDWriteBitmapRenderTarget::DrawGlyphRun

    Uygulamalar, IDWriteBitmapRenderTarget::DrawGlyphRun yöntemini kullanarak 32 bpp bitmap üzerine bir dizi glif yazılım işlemesi gerçekleştirebilir. IDWriteBitmapRenderTarget nesnesi, glifleri işlemek için kullanılabilecek bir bit eşlem ile bir bellek aygıtı bağlamını kapsüller. Bu API, GDI'da işlenen mevcut bir kod tabanınız olduğundan GDI ile kalmak istiyorsanız kullanışlıdır.

GDI kullanan mevcut metin düzeni koduna sahip bir uygulamanız varsa ve var olan düzen kodunu korumak ancak yalnızca glifleri işlemenin son adımı için DirectWrite kullanmak istiyorsanız, IDWriteGdiInterop::CreateFontFaceFromHdc iki API arasındaki köprüyü sağlar. Bu işlevi çağırmadan önce, uygulama cihaz bağlamından bir yazı tipi yüz başvurusu almak için IDWriteGdiInterop::CreateFontFaceFromHdc işlevini kullanır.

Not

Çoğu senaryoda uygulamaların bu glif işleme API'lerini kullanması gerekmeyebilir. Bir uygulama bir IDWriteTextLayout nesnesi oluşturduktan sonra, ID2D1RenderTarget::DrawTextLayout yöntemini kullanarak metni işleyebilir.

 

Özel İşleme Modları

Gama, ClearType düzeyi, piksel geometrisi ve gelişmiş karşıtlık gibi çeşitli parametreler metin işlemeyi etkiler. İşleme parametreleri, IDWriteRenderingParamsarabirimini geneluygulayan bir nesne tarafından kapsüllenir. İşleme parametreleri nesnesi, Windows 7'deki ClearType denetim masası uygulaması aracılığıyla belirtilen donanım özelliklerine ve/veya kullanıcı tercihlerine göre otomatik olarak başlatılır. Genellikle, bir istemci DirectWrite düzen API'sini kullanıyorsa, DirectWrite otomatik olarak belirtilen ölçüm moduna karşılık gelen bir işleme modunu seçer.

Daha fazla denetim isteyen uygulamalar, farklı işleme seçeneklerini uygulamak için IDWriteFactory::CreateCustomRenderingParams kullanabilir. Bu işlev gama, piksel geometrisi ve gelişmiş karşıtlığı ayarlamak için de kullanılabilir.

Çeşitli işleme seçenekleri şunlardır:

  • Alt piksel kenar yumuşatma

    Uygulama, renderingMode parametresini DWRITE_RENDERING_MODE_NATURAL olarak ayarlayarak yalnızca yatay boyutta kenar yumuşatma ile işlemeyi belirtir.

  • Hem yatay hem de dikey boyutlarda alt piksel kenar düzeltme.

    Uygulama, renderingMode parametresini DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC olarak ayarlayarak hem yatay hem de dikey boyutlarda kenar yumuşatma ile işlemeyi belirtir. Bu, eğrilerin ve çapraz çizgilerin yumuşaklık pahasına daha yumuşak görünmesini sağlar ve genellikle 16 ppem'nin üzerindeki boyutlarda kullanılır.

  • Takma Adlı Metin

    Uygulama renderingMode parametresini diğer adı belirtilen metni belirtmek için DWRITE_RENDERING_MODE_ALIASED olarak ayarlar.

  • Gri Tonlamalı Metin

    Uygulama, gri tonlamalı metin belirtmek için pixelGeometry parametresini DWRITE_PIXEL_GEOMETRY_FLAT olarak ayarlar.

  • GDI uyumlu genişlik (Doğu Asya gömülü bitmap dahil)

    Uygulama, renderingMode parametresini DWRITE_RENDERING_MODE_GDI_CLASSIC olarak ayarlayarak GDI uyumlu genişlikte köşegeni yumuşatma sağlamak için kullanır.

  • GDI doğal genişlik

    Uygulama, renderingMode parametresini GDI doğal genişlik uyumlu kenar yumuşatmayı belirtmek için DWRITE_RENDERING_MODE_GDI_NATURAL olarak ayarlar.

  • Anahat metni

    Uygulama geliştiricisi, büyük boyutlarda işlemek için bit eşlem haline getirmek yerine yazı tipi konturunu kullanarak işlemeyi tercih edebilir. Uygulama, renderingMode parametresini DWRITE_RENDERING_MODE_OUTLINE olarak ayarlayarak işlemenin rasterleştiriciyi atlayıp ana hatları doğrudan kullanmasını sağlar.

GDI Birlikte Çalışabilirliği

IDWriteGdiInterop arabirimi GDI ile birlikte çalışabilirlik sağlar. Bu, uygulamaların GDI kod temellerine yönelik mevcut yatırımlarına devam etmelerini ve işleme veya düzen için DirectWrite seçmeli olarak kullanmalarını sağlar.

Bir uygulamanın GDI yazı tipi sistemine veya GDI yazı tipi sisteminden geçiş yapmasını sağlayan API'ler şunlardır:

Sonuç

Okuma deneyimini geliştirmek, ister ekranda ister kağıt üzerinde olsun, kullanıcılar için çok değerlidir. DirectWrite, uygulama geliştiricilerinin Windows uygulamaları için metin deneyimini geliştirmeleri için kullanım kolaylığı ve katmanlı programlama modeli sağlar. Uygulamalar, düzen API'siyle kullanıcı arabirimi ve belgeleri için zengin biçimlendirilmiş metin işlemek üzere DirectWrite kullanabilir. Daha karmaşık senaryolar için bir uygulama doğrudan gliflerle çalışabilir, yazı tiplerine erişebilir ve yüksek kaliteli tipografi sunmak için DirectWrite'in gücünden yararlanabilir.

DirectWrite'in birlikte çalışabilirlik özellikleri, uygulama geliştiricilerinin mevcut Win32 kod temellerini ileri taşımasına ve directWrite'i uygulamaları içinde seçmeli olarak benimsemesine olanak.