Share via


Erstellen einer privaten Schriftartsammlung

Die PrivateFontCollection-Klasse erbt von der abstrakten FontCollection-Basisklasse . Sie können ein PrivateFontCollection-Objekt verwenden, um eine Reihe von Schriftarten speziell für Ihre Anwendung zu verwalten.

Eine private Schriftartsammlung kann installierte Systemschriftarten sowie Schriftarten enthalten, die nicht auf dem Computer installiert wurden. Um einer privaten Schriftartensammlung eine Schriftdatei hinzuzufügen, rufen Sie die PrivateFontCollection::AddFontFile-Methode eines PrivateFontCollection-Objekts auf.

Hinweis

Wenn Sie die GDI+-API verwenden, dürfen Sie ihrer Anwendung niemals erlauben, beliebige Schriftarten aus nicht vertrauenswürdigen Quellen herunterzuladen. Das Betriebssystem erfordert erhöhte Berechtigungen, um sicherzustellen, dass alle installierten Schriftarten vertrauenswürdig sind.

 

Die FontCollection::GetFamilies-Methode eines PrivateFontCollection-Objekts gibt ein Array von FontFamily-Objekten zurück. Bevor Sie FontCollection::GetFamilies aufrufen, müssen Sie einen Puffer zuordnen, der groß genug ist, um dieses Array zu speichern. Um die Größe des erforderlichen Puffers zu bestimmen, rufen Sie die FontCollection::GetFamilyCount-Methode auf, und multiplizieren Sie den Rückgabewert mit sizeof(FontFamily).

Die Anzahl der Schriftfamilien in einer privaten Schriftartsammlung entspricht nicht unbedingt der Anzahl der Schriftartdateien, die der Sammlung hinzugefügt wurden. Angenommen, Sie fügen die Dateien „ArialBd.tff“, „Times.tff“ und „TimesBd.tff“ zu einer Sammlung hinzu. Es gibt drei Dateien, aber nur zwei Familien in der Sammlung, da „Times.tff“ und „TimesBd.tff“ zu derselben Familie gehören.

Im folgenden Beispiel werden einem PrivateFontCollection-Objekt die folgenden drei Schriftartdateien hinzugefügt:

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

Der Code ruft die FontCollection::GetFamilyCount-Methode des PrivateFontCollection-Objekts auf, um die Anzahl der Familien in der privaten Auflistung zu bestimmen, und ruft dann FontCollection::GetFamilies auf, um ein Array von FontFamily-Objekten abzurufen.

Für jedes FontFamily-Objekt in der Auflistung ruft der Code die FontFamily::IsStyleAvailable-Methode auf, um zu bestimmen, ob verschiedene Stile (normal, fett, fett, kursiv, unterstrichen und strikeout) verfügbar sind. Die an die FontFamily::IsStyleAvailable-Methode übergebenen Argumente sind Member der FontStyle-Enumeration , die in Gdiplusenums.h deklariert wird.

Wenn eine bestimmte Familie/Stil-Kombination verfügbar ist, wird ein Font-Objekt mit dieser Familie und diesem Stil erstellt. Das erste Argument, das an den Font-Konstruktor übergeben wird, ist der Name der Schriftartfamilie (kein FontFamily-Objekt , wie es bei anderen Variationen des Font-Konstruktors der Fall ist), und das letzte Argument ist die Adresse des PrivateFontCollection-Objekts . Nachdem das Font-Objekt erstellt wurde, wird seine Adresse an die DrawString-Methode der Graphics-Klasse übergeben, um den Familiennamen zusammen mit dem Namen der Formatvorlage anzuzeigen.

#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;
            

Die folgende Abbildung zeigt die Ausgabe des vorherigen Codes.

Screenshot eines Fensters mit neun Schriftartnamen, von denen jeder die benannte Schriftart veranschaulicht

Arial.tff (die im vorherigen Codebeispiel der Sammlung privater Schriftarten hinzugefügt wurde) ist die Schriftartdatei für das reguläre Arial-Format. Beachten Sie jedoch, dass die Programmausgabe mehrere verfügbare Formatvorlagen anzeigt, die nicht regulär für die Arial-Schriftartfamilie sind. Das liegt daran, dass Windows GDI+ die fetten, kursiv und fetten Kursivstile aus dem regulären Stil simulieren kann. GDI+ kann auch Unterstreichungen und durchgestrichene Begriffe aus der regulären Formatvorlage erzeugen.

Ebenso kann GDI+ die Formatvorlage „fett kursiv“ entweder aus der fett formatierten Formatvorlage oder der kursiv formatierten Formatvorlage simulieren. Die Programmausgabe zeigt, dass die fett kursiv formatierte Formatvorlage für die Times-Familie verfügbar ist, obwohl „TimesBd.tff“ (Times New Roman, fett) die einzige Times-Datei in der Sammlung ist.

Diese Tabelle gibt die nicht systembasierten Schriftarten an, die von GDI+ unterstützt werden.

Format GDI GDI+ unter Windows 7 GDI+ auf Windows 8 DirectWrite
. AO) ja Nein Nein Nein
. FNT ja Nein Nein Nein
. TTF ja ja ja ja
. OTF mit TrueType ja ja ja ja
. OTF mit Adobe CFF ja Nein ja ja
Adobe Typ 1 ja Nein Nein nein