次の方法で共有


プライベート フォント コレクションの作成

PrivateFontCollection クラスは、FontCollection 抽象基本クラスから継承します。 PrivateFontCollection オブジェクトを使用して、アプリケーション専用のフォントセットを維持できます。

プライベート フォント コレクションには、インストールされているシステム フォントに加えて、コンピューターにインストールされていないフォントも含めることができます。 プライベート フォント コレクションにフォント ファイルを追加するには、PrivateFontCollection オブジェクトの PrivateFontCollection::AddFontFile メソッドを呼び出します。

注意

GDI+ API を使用する場合、アプリケーションで信頼されていないソースから任意のフォントをダウンロードすることを許可しないでください。 オペレーティング システムでは、インストールされているすべてのフォントが信頼されるように、昇格された特権が必要です。

 

PrivateFontCollection オブジェクトの FontCollection::GetFamilies メソッドは、FontFamily オブジェクトの配列を返します。 FontCollection::GetFamilies を呼び出す前に、その配列を保持するのに十分な大きさのバッファーを割り当てる必要があります。 必要なバッファーのサイズを確認するには、 FontCollection::GetFamilyCount メソッドを呼び出し、戻り値に sizeof(FontFamily) を掛けます。

プライベート フォント コレクション内のフォント ファミリの数は、必ずしもコレクションに追加されたフォント ファイルの数と同じではありません。 たとえば、ファイル ArialBd.tff、Times.tff、および TimesBd.tff をコレクションに追加するとします。 コレクションには 3 つのファイルが存在することになりますが、ファミリは 2 つだけです。Times.tff と TimesBd.tff は同じファミリに属しているためです。

次の例では、 PrivateFontCollection オブジェクトに次の 3 つのフォント ファイルを追加します。

  • C:\WINNT\Fonts\Arial.tff (Arial, regular)
  • C:\WINNT\Fonts\CourBI.tff (Courier New, bold italic)
  • C:\WINNT\Fonts\TimesBd.tff (Times New Roman, bold)

このコードでは、PrivateFontCollection オブジェクトの FontCollection::GetFamilyCount メソッドを呼び出してプライベート コレクション内のファミリの数を決定し、FontCollection::GetFamilies を呼び出して FontFamily オブジェクトの配列を取得します。

コレクション内の FontFamily オブジェクトごとに、 FontFamily::IsStyleAvailable メソッドを呼び出して、さまざまなスタイル (標準、太字、斜体、太字斜体、下線、取り消し線) を使用できるかどうかを判断します。 FontFamily::IsStyleAvailable メソッドに渡される引数は、Gdiplusenums.h で宣言されている FontStyle 列挙体のメンバーです。

特定のファミリ/スタイルの組み合わせを使用できる場合は、そのファミリとスタイルを使用して Font オブジェクトが構築されます。 Font コンストラクターに渡される最初の引数はフォント ファミリ名です (FontFamily オブジェクトではなく、Font コンストラクターの他のバリエーションの場合と同様)。最後の引数は PrivateFontCollection オブジェクトのアドレスです。 Font オブジェクトが構築されると、そのアドレスが Graphics クラスの DrawString メソッドに渡され、ファミリ名とスタイルの名前が表示されます。

#define MAX_STYLE_SIZE 20
#define MAX_FACEANDSTYLE_SIZE (LF_FACESIZE + MAX_STYLE_SIZE + 2)

PointF      pointF(10.0f, 0.0f);
SolidBrush  solidBrush(Color(255, 0, 0, 0));
INT                   count = 0;
INT                   found = 0;
WCHAR                 familyName[LF_FACESIZE];
WCHAR                 familyNameAndStyle[MAX_FACEANDSTYLE_SIZE]; 
FontFamily*           pFontFamily;
PrivateFontCollection privateFontCollection;

// Add three font files to the private collection.
privateFontCollection.AddFontFile(L"c:\\Winnt\\Fonts\\Arial.ttf");
privateFontCollection.AddFontFile(L"c:\\Winnt\\Fonts\\CourBI.ttf");
privateFontCollection.AddFontFile(L"c:\\Winnt\\Fonts\\TimesBd.ttf");

// How many font families are in the private collection?
count = privateFontCollection.GetFamilyCount();

// Allocate a buffer to hold the array of FontFamily
// objects returned by GetFamilies.
pFontFamily = new FontFamily[count];

// Get the array of FontFamily objects.
privateFontCollection.GetFamilies(count, pFontFamily, &found);

// Display the name of each font family in the private collection
// along with the available styles for that font family.
for(INT j = 0; j < count; ++j)
{
   // Get the font family name.
   pFontFamily[j].GetFamilyName(familyName);
   
   // Is the regular style available?
   if(pFontFamily[j].IsStyleAvailable(FontStyleRegular))
   {
      StringCchCopyW(familyNameAndStyle, LF_FACESIZE, familyName);
      StringCchCatW(familyNameAndStyle, MAX_FACEANDSTYLE_SIZE, L" Regular");

      Font* pFont = new Font(
         familyName, 16, FontStyleRegular, UnitPixel, &privateFontCollection);

      graphics.DrawString(familyNameAndStyle, -1, pFont, pointF, &solidBrush);

      pointF.Y += pFont->GetHeight(0.0f);
      delete(pFont);      
   }

   // Is the bold style available?
   if(pFontFamily[j].IsStyleAvailable(FontStyleBold))
   {
      StringCchCopyW(familyNameAndStyle, LF_FACESIZE, familyName);
      StringCchCatW(familyNameAndStyle, MAX_FACEANDSTYLE_SIZE, L" Bold");

      Font* pFont = new Font(
         familyName, 16, FontStyleBold, UnitPixel, &privateFontCollection);

      graphics.DrawString(familyNameAndStyle, -1, pFont, pointF, &solidBrush);

      pointF.Y += pFont->GetHeight(0.0f);
      delete(pFont);
   }

   // Is the italic style available?
   if(pFontFamily[j].IsStyleAvailable(FontStyleItalic))
   {
      StringCchCopyW(familyNameAndStyle, LF_FACESIZE, familyName);
      StringCchCatW(familyNameAndStyle, MAX_FACEANDSTYLE_SIZE, L" Italic");

      Font* pFont = new Font(
         familyName, 16, FontStyleItalic, UnitPixel, &privateFontCollection);

      graphics.DrawString(familyNameAndStyle, -1, pFont, pointF, &solidBrush);

      pointF.Y += pFont->GetHeight(0.0f);
      delete(pFont);
   }

   // Is the bold italic style available?
   if(pFontFamily[j].IsStyleAvailable(FontStyleBoldItalic))
   {
      StringCchCopyW(familyNameAndStyle, LF_FACESIZE, familyName);
      StringCchCatW(familyNameAndStyle, MAX_FACEANDSTYLE_SIZE, L" BoldItalic");

      Font* pFont = new Font(familyName, 16, 
         FontStyleBoldItalic, UnitPixel, &privateFontCollection);

      graphics.DrawString(familyNameAndStyle, -1, pFont, pointF, &solidBrush);

      pointF.Y += pFont->GetHeight(0.0f);
      delete(pFont);
    }

   // Is the underline style available?
   if(pFontFamily[j].IsStyleAvailable(FontStyleUnderline))
   {
      StringCchCopyW(familyNameAndStyle, LF_FACESIZE, familyName);
      StringCchCatW(familyNameAndStyle, MAX_FACEANDSTYLE_SIZE, L" Underline");

      Font* pFont = new Font(familyName, 16, 
         FontStyleUnderline, UnitPixel, &privateFontCollection);

      graphics.DrawString(familyNameAndStyle, -1, pFont, pointF, &solidBrush);

      pointF.Y += pFont->GetHeight(0.0);
      delete(pFont);
   }
 
   // Is the strikeout style available?
   if(pFontFamily[j].IsStyleAvailable(FontStyleStrikeout))
   {
      StringCchCopyW(familyNameAndStyle, LF_FACESIZE, familyName);
      StringCchCatW(familyNameAndStyle, MAX_FACEANDSTYLE_SIZE, L" Strikeout");

      Font* pFont = new Font(familyName, 16, 
         FontStyleStrikeout, UnitPixel, &privateFontCollection);

      graphics.DrawString(familyNameAndStyle, -1, pFont, pointF, &solidBrush);

      pointF.Y += pFont->GetHeight(0.0f);
      delete(pFont);
   }

   // Separate the families with white space.
   pointF.Y += 10.0f;

} // for

delete pFontFamily;
            

次の図は、上記のコードの出力を示しています。

9 つのフォント名を一覧表示するウィンドウのスクリーン ショット。それぞれのフォントは、名前付きフォントを示しています

Arial.tff (前のコード例でプライベート フォント コレクションに追加されました) は、Arial 標準スタイルのフォント ファイルです。 ただし、プログラムの出力には、Arial フォント ファミリの標準以外に使用可能なスタイルがいくつか表示されていることに注意してください。 これは、Windows GDI+ では通常のスタイルから太字、斜体、太字の斜体のスタイルをシミュレートできるためです。 また、GDI+ を使用すると、標準スタイルから下線と取り消し線を生成することもできます。

同様に、GDI+ では、太字スタイルまたは斜体スタイルのどちらからも太字斜体スタイルをシミュレートすることができます。 プログラムの出力を見ると、コレクション内では TimesBd.tff (Times New Roman、太字) が唯一の Times ファイルであるのに、太字斜体スタイルも Times ファミリで使用できるようになっているのがわかります。

次の表では、GDI+ でサポートされるシステム以外のフォントを指定します。

フォーマット GDI Windows 7 の GDI+ gdi+ on Windows 8 DirectWrite
.Fon はい no no no
.Fnt はい no no no
.Ttf はい はい はい はい
.TrueType の OTF はい はい はい はい
.Adobe CFF を使用した OTF はい no はい はい
Adobe Type 1 はい no no