Partager via


Création de collections de polices privées

La classe PrivateFontCollection hérite de la classe de base abstraite FontCollection . Vous pouvez utiliser un objet PrivateFontCollection pour gérer un ensemble de polices spécifiquement pour votre application.

Une collection de polices privée peut inclure des polices système installées ainsi que des polices qui n’ont pas été installées sur l’ordinateur. Pour ajouter un fichier de polices à une collection de polices privée, appelez la méthode PrivateFontCollection::AddFontFile d’un objet PrivateFontCollection .

Notes

Lorsque vous utilisez l’API GDI+, vous ne devez jamais autoriser votre application à télécharger des polices arbitraires à partir de sources non approuvées. Le système d’exploitation nécessite des privilèges élevés pour garantir que toutes les polices installées sont approuvées.

 

La méthode FontCollection::GetFamilies d’un objet PrivateFontCollection retourne un tableau d’objets FontFamily . Avant d’appeler FontCollection::GetFamilies, vous devez allouer une mémoire tampon suffisamment grande pour contenir ce tableau. Pour déterminer la taille de la mémoire tampon requise, appelez la méthode FontCollection::GetFamilyCount et multipliez la valeur de retour par sizeof(FontFamily).

Le nombre de familles de polices dans une collection de polices privée n’est pas nécessairement le même que le nombre de fichiers de police qui ont été ajoutés à la collection. Par exemple, supposons que vous ajoutez les fichiers ArialBd.tff, Times.tff et TimesBd.tff à une collection. Il y aura trois fichiers, mais seulement deux familles dans la collection, car Times.tff et TimesBd.tff appartiennent à la même famille.

L’exemple suivant ajoute les trois fichiers de police suivants à un objet PrivateFontCollection :

  • C:\WINNT\Fonts\Arial.tff (Arial, normal)
  • C:\WINNT\Fonts\CourBI.tff (Courier New, gras italique)
  • C:\WINNT\Fonts\TimesBd.tff (Times New Roman, gras)

Le code appelle la méthode FontCollection::GetFamilyCount de l’objet PrivateFontCollection pour déterminer le nombre de familles dans la collection privée, puis appelle FontCollection::GetFamilies pour récupérer un tableau d’objets FontFamily .

Pour chaque objet FontFamily de la collection, le code appelle la méthode FontFamily::IsStyleAvailable pour déterminer si différents styles (régulier, gras, italique, gras, italique, souligné et barré) sont disponibles. Les arguments passés à la méthode FontFamily::IsStyleAvailable sont membres de l’énumération FontStyle , qui est déclarée dans Gdiplusenums.h.

Si une combinaison famille/style particulière est disponible, un objet Font est construit à l’aide de cette famille et de ce style. Le premier argument passé au constructeur Font est le nom de la famille de polices (pas un objet FontFamily comme c’est le cas pour d’autres variantes du constructeur Font ), et l’argument final est l’adresse de l’objet PrivateFontCollection . Une fois l’objet Font construit, son adresse est passée à la méthode DrawString de la classe Graphics pour afficher le nom de la famille ainsi que le nom du style.

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

L’illustration suivante montre la sortie du code précédent.

capture d’écran d’une fenêtre qui répertorie neuf noms de police, chacun illustrant la police nommée

Arial.tff (qui a été ajouté à la collection de polices privées dans l’exemple de code précédent) est le fichier de police pour le style normal Arial. Notez toutefois que la sortie du programme affiche plusieurs styles disponibles autres que standard pour la famille de polices Arial. En effet, Windows GDI+ peut simuler les styles italiques gras, italiques et gras du style standard. GDI+ peut également produire des soulignements et des grèves à partir du style normal.

De même, GDI+ peut simuler le style italique gras à partir du style gras ou du style italique. La sortie du programme montre que le style italique gras est disponible pour la famille Times même si TimesBd.tff (Times New Roman, bold) est le seul fichier Times de la collection.

Ce tableau spécifie les polices non système que GDI+ prend en charge.

Format GDI GDI+ sur Windows 7 GDI+ sur Windows 8 DirectWrite
. FON Oui non non non
. FNT Oui non non non
. TTF Oui Oui Oui Oui
. OTF avec TrueType Oui Oui Oui Oui
. OTF avec Adobe CFF Oui non Oui Oui
Adobe Type 1 Oui non non Non