Я перечисляя шрифты Windows, как это:Почему FONTSIGNATURE не отражает lfCharSet?
LOGFONTW lf = {0};
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfFaceName[0] = L'\0';
lf.lfPitchAndFamily = 0;
::EnumFontFamiliesEx(hdc, &lf,
reinterpret_cast<FONTENUMPROCW>(FontEnumCallback),
reinterpret_cast<LPARAM>(this), 0);
Моя функция обратного вызова имеет эту подпись:
int CALLBACK FontEnumerator::FontEnumCallback(const ENUMLOGFONTEX *pelf,
const NEWTEXTMETRICEX *pMetrics,
DWORD font_type,
LPARAM context);
Для TrueType шрифтов, я обычно получают каждое имя FACE несколько раз. Например, для нескольких вызовов я получу pelf->elfFullName
и pelf->elfLogFont.lfFaceName
, установленный как "Arial"
. Если посмотреть более внимательно на другие поля, я вижу, что каждый вызов для другого скрипта. Например, при первом вызове pelf->elfScript
будет "Western"
, а pelf->elfLogFont.lfCharSet
будет численным эквивалентом ANSI_CHARSET
. Во втором звонке я получаю "Hebrew"
и HEBREW_CHARSET
. Третий вызов "Arabic"
и ARABIC_CHARSET
. И так далее. Все идет нормально.
Но поле font signature (pMetrics->ntmFontSig
) для всех версий Arial идентично. Фактически, подпись шрифта утверждает, что все эти версии поддержки Arial Latin-1, иврит, арабский и другие.
Я знаю набор символов строк, которые я пытаюсь нарисовать, поэтому я пытаюсь создать соответствующий шрифт на основе подписи шрифта. Поскольку подписи шрифтов всегда совпадают, я всегда выбираю «западный» шрифт, даже при отображении текста на иврите или арабском языке. Я использую низкоуровневые API-интерфейсы Uniscribe, поэтому я не получаю преимущества связывания шрифтов Windows, и, тем не менее, мой код работает.
Действительно ли имеет значение lfCharSet
или является ли оно устаревшим артефактом? Должен ли я просто установить lfCharSet
на DEFAULT_CHARSET
и перестать беспокоиться обо всех вариантах скриптов каждого лица?
Для моих целей мне нужны только шрифты TrueType и OpenType.