2011-01-02 13 views
16

To doprowadza mnie do szału przez cały dzień.Uzyskaj nazwę pliku czcionki na podstawie nazwy i stylu czcionki (pogrubienie/kursywa).

Potrzebuję uzyskać nazwę pliku czcionki (np. Arial.ttf) na podstawie jego nazwy (w tym przypadku Arial) i tego, czy jest pogrubiony, kursywy, czy jedno i drugie. Korzystając z tych informacji, muszę znaleźć plik czcionki, aby móc go użyć do renderowania.

Więcej przykładów:

  • Calibri, Bold rozwiąże się calibrib.ttf.
  • Calibri, Kursywa zostanie rozwiązany na calibrii.ttf.

Wszelkie pomysły, w jaki sposób mogę to osiągnąć w C++ (Win32)

+0

Jeśli posiadasz uchwyt czcionki HFONT, możesz wypróbować moje [proponowane rozwiązanie] (http://stackoverflow.com/questions/16769758/get-a-font-filename-based-on-the-font- handle-hfont). Nie chciałem dodawać tutaj odpowiedzi, ponieważ pytanie nie jest jasne, czy masz uchwyt czcionki, czy nie. –

Odpowiedz

10

Po pierwsze, o ile mi wiadomo, nie ma niezawodny sposób, aby to zrobić.

Interfejs API systemu Windows dotyczy rodzin czcionek i mapowań, a nie plików czcionek, które są obsługiwane na niższym poziomie. Zauważ też, że nawet jeśli uda Ci się uzyskać nazwę pliku czcionki, żadna funkcja renderowania (którą znam) nie zaakceptuje jej, więc co z nią zrobisz?

Mimo to można wyszukać klucz rejestru HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts, aby uzyskać nazwę pliku czcionki z jego logicznej nazwy. Implementację tego rozwiązania można znaleźć pod adresem here.

+6

Potrzebuję nazwy pliku czcionki, ponieważ używam FreeType do renderowania czcionki, a FreeType akceptuje tylko nazwę pliku. – Brad

+1

To odwzorowanie nie działa, gdy system operacyjny jest w innym języku. Nazwa, którą otrzymasz z EnumFontFamiliesExW jest językiem systemu operacyjnego (np .: 굵은 2006 굵은), podczas gdy nazwa rejestru jest zawsze w języku angielskim (np. Ahn2006-B (TrueType)). Microsoft wydaje się robić dodatkowe kroki podczas odwzorowywania nazwy twarzy na faktyczny plik czcionki. –

0

Jednym z rozwiązań byłoby uzyskanie dostępu do plików czcionek i wyodrębnienie nazwy z tabeli nazw, aby utworzyć własne wyszukiwanie (mapa STL byłaby to prosta metoda). Szczegóły formatu pliku TTF można znaleźć here.

+0

To jest to, co robiłem w bibliotece FreeType. I iteruję wszystkie pliki czcionek w% WINDIR%/Czcionki Następnie mogę sprawdzić ich typ twarzy i pogrubić/pochylić kursywą lub jedno i drugie. Problem polega na tym, że katalog Fonts zawiera pliki, które FreeType ma problem z odczytaniem, co powoduje, że FreeType wypluwa błędy. – Brad

1

Zwykle robisz to, dzwoniąc pod numer CreateFontIndirect, a następnie wykonując renderowanie systemu. Być może mógłbyś wyjaśnić, dlaczego nie możesz zastosować tego standardowego podejścia.

2

Ten Code Project project robi to, co chcesz. Jak to się dzieje w Windows 7, ponieważ funkcja GetWinVer przestaje działać w XP. To jest trywialne, aby dodać sprawę dla systemu Windows 7.

1

związanych z wcześniejszych postów, to wydaje się być niezawodny sposób:

1) Czytaj zarejestrowaną listę czcionek Windows z HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Fonts \ Tutaj uzyskasz nazwy plików i alternatywne ścieżki plików. Nazwy czcionek są nieprzydatne, ponieważ mogą zmieniać się w ustawieniach regionalnych użytkownika.

2) Załaduj pliki TrueType (.ttf, .ttc, .otf): Użyj FreeType https://www.freetype.org/). Po prostu zainicjuj bibliotekę freetype i wczytaj twarz za pomocą FT_New_Face (biblioteka, ścieżka, 0, & twarz).

3) Uzyskaj nazwę rodziny czcionek za pomocą FreeType. Użyj FT_Get_Sfnt_Name_Count() i FT_Get_Sfnt_Name(), aby uzyskać tabelę ciągów. Należy sprawdzić, czy kodowanie to Ansi, UTF16 lub inne, ponieważ niektóre ciągi będą w wielu różnych językach i kodowaniach.

4) Uzyskaj właściwości TrueType OS2. Użyj (TT_OS2 *) FT_Get_Sfnt_Table (twarz, ft_sfnt_os2), aby uzyskać strukturę OS2. Interpretuj strukturę przy użyciu dokumentów takich, jak: https://www.microsoft.com/typography/otspec/os2.htm#fc

5) Teraz masz ścieżkę pliku czcionki, nazwę rodziny, właściwości stylu i inne informacje. Zbuduj listę tych i funkcji, aby wyszukać plik na podstawie rodziny i stylu czcionki.

Powiązane problemy