2016-11-01 4 views
0

私はIDWriteFactory :: GetSystemFontCollectionを使って、使用可能なすべてのフォントをC++で取得しようとしています。私はすべてのMicrosoft MSDNの手順に従った。今私は正常にすべての主要なフォントを得ることができますが、それは "バリアント"フォントを提供しません。IDWriteFactory :: GetSystemFontCollectionはフォントの変形を与えません

例: "Arial"と "Arial Narrow"、 "Yu Gothic"はありませんが、 "Yu Gothic Medium"と "Yu Gothic Light"はありません。 C++でこれらのフォントをすべて取得する方法を知っている人はいますか?ありがとうございました!

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

答えて

1

GDIは、明確なフォントファミリごとに4つの亜種の制限を持っていた:

以下は私のプログラムです。したがって、Arial BlackとArial Narrowは別々のフォントファミリーとして扱われなければなりませんでしたが、現実にはArialのさまざまなバリエーションです。

DirectWriteにはその制限がないため、Arialだけがあり、Arial BlackとArial NarrowはArialの変種として登場します。それを試してください:ArialのIDWriteFontFamilyにGetFonts()を呼び出し、すべての結果IDWriteFontsのGetFaceNames()を表示してください。

もちろん、これはGDIフォント列挙を使用するプログラムを使用している人にとっては直感的ではないかもしれません。または、Arial Blackのファミリ名がではなくArial Black(ファイル形式など)であることが予想されます。私はその問題の解決策が何であるか分かりません。

+0

ありがとう!それはうまくいった! – user3508838

関連する問題