Udostępnij za pośrednictwem


Tworzenie kolekcji czcionek prywatnych

Klasa PrivateFontCollection dziedziczy z abstrakcyjnej klasy bazowej FontCollection. Możesz użyć obiektu PrivateFontCollection, aby zachować zestaw czcionek przeznaczonych specjalnie dla aplikacji.

Prywatna kolekcja czcionek może zawierać zainstalowane czcionki systemowe, a także czcionki, które nie zostały zainstalowane na komputerze. Aby dodać plik czcionki do prywatnej kolekcji czcionek, wywołaj metodę PrivateFontCollection::AddFontFile metody PrivateFontCollection.

Notatka

W przypadku korzystania z interfejsu API GDI+ nigdy nie musisz zezwalać aplikacji na pobieranie dowolnych czcionek ze źródeł niezaufanych. System operacyjny wymaga podniesionych uprawnień w celu zapewnienia, że wszystkie zainstalowane czcionki są zaufane.

 

Metoda FontCollection::GetFamilies obiektu PrivateFontCollection zwraca tablicę obiektów FontFamily. Przed wywołaniem FontCollection::GetFamiliesnależy przydzielić bufor wystarczająco duży, aby pomieścić tę tablicę. Aby określić rozmiar wymaganego buforu, wywołaj metodę FontCollection::GetFamilyCount i pomnożyj wartość zwracaną przez sizeof(FontFamily).

Liczba rodzin czcionek w prywatnej kolekcji czcionek nie musi być taka sama jak liczba plików czcionek, które zostały dodane do kolekcji. Załóżmy na przykład, że do kolekcji zostaną dodane pliki ArialBd.tff, Times.tff i TimesBd.tff. Będą trzy pliki, ale tylko dwie rodziny w kolekcji, ponieważ Times.tff i TimesBd.tff należą do tej samej rodziny.

Poniższy przykład dodaje następujące trzy pliki czcionek do obiektu PrivateFontCollection:

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

Kod wywołuje metodę FontCollection::GetFamilyCount obiektu PrivateFontCollection, aby określić liczbę rodzin w prywatnej kolekcji, a następnie wywołuje FontCollection::GetFamilies, aby pobrać tablicę obiektów FontFamily.

Dla każdego obiektu FontFamily w kolekcji kod wywołuje metodę FontFamily::IsStyleAvailable, aby określić, czy są dostępne różne style (normalny, pogrubienie, kursywa, pogrubiona kursywa, podkreślenie i przekreślenie). Argumenty przekazane do metody FontFamily::IsStyleAvailable są elementami składowymi FontStyle wyliczenia, które jest zadeklarowane w Gdiplusenums.h.

Jeśli określona kombinacja rodziny/stylu jest dostępna, obiekt czcionki jest tworzony przy użyciu tej rodziny i stylu. Pierwszym argumentem przekazanym do konstruktora czcionki jest nazwa rodziny czcionek (a nie obiekt FontFamily, podobnie jak w przypadku innych odmian konstruktora czcionki), a ostatnim argumentem jest adres obiektu PrivateFontCollection. Po skonstruowaniu obiektu czcionki jego adres jest przekazywany do metody DrawString klasy Graphics, aby wyświetlić nazwę rodziny wraz z nazwą stylu.

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

Poniższa ilustracja przedstawia dane wyjściowe poprzedniego kodu.

zrzut ekranu okna z listą dziewięciu nazw czcionek, z których każda demonstruje nazwaną czcionkę

Arial.tff (który został dodany do prywatnej kolekcji czcionek w poprzednim przykładzie kodu) jest plikiem czcionki dla stylu regularnego Arial. Należy jednak pamiętać, że dane wyjściowe programu zawierają kilka dostępnych stylów innych niż zwykłe dla rodziny czcionek Arial. Dzieje się tak dlatego, że Windows GDI+ może symulować pogrubienie, kursywę i pogrubioną kursywę ze zwykłego stylu. GDI+ może również tworzyć podkreślenie i przekreślenia w stylu regularnym.

Podobnie GDI+ może symulować pogrubiony styl kursywy z stylu pogrubionego lub kursywy. Dane wyjściowe programu pokazują, że pogrubiony styl kursywy jest dostępny dla rodziny Times, mimo że TimesBd.tff (Times New Roman, bold) jest jedynym plikiem Times w kolekcji.

Ta tabela określa czcionki niesystemowe obsługiwane przez interfejs GDI+.

Format GDI GDI+ w systemie Windows 7 GDI+ w systemie Windows 8 DirectWrite
. FON tak Nie Nie Nie
. FNT tak Nie Nie Nie
.TTF tak tak tak tak
.OTF z technologią TrueType tak tak tak tak
.OTF z funkcją Adobe CFF tak Nie tak tak
Adobe Type 1 tak Nie Nie Nie