При разработке приложений на Delphi и Pascal часто возникает необходимость работы с различными языковыми наборами символов. Это может быть связано с отображением текста на экране или при печати. В данной статье мы рассмотрим, как проверить, поддерживает ли шрифт определенные языковые наборы, и как это можно использовать для фильтрации шрифтов в приложении.
Описание проблемы
Для приложения необходимо отобразить список системных шрифтов, но исключить из него те, которые не поддерживают 20 предопределенных языков. Для этого нужно знать, какие наборы символов (кодовые страницы) поддерживает каждый шрифт.
Решение проблемы
Для получения списка доступных шрифтов можно использовать класс Vcl.Forms.Screen.Fonts. Однако, зная только имя шрифта, необходимо проверить, какие наборы символов поддерживает данный шрифт.
Один из способов — использовать функцию GetGlyphIndices, которая позволяет определить, существует ли в шрифте заданный глиф. Например, для проверки поддержки кириллицы можно проверить наличие символов Ф, Ў или ξ.
Пример кода
procedure TestGlyphSupport(dc: HDC; str: UnicodeString);
var
buf: array of WORD;
len, i: Integer;
count: DWORD;
begin
len := Length(str);
SetLength(buf, len);
count := GetGlyphIndicesW(dc, PWideChar(str), len, @buf[0], GGI_MARK_NONEXISTING_GLYPHS);
if count > 0 then
begin
for i := 0 to count - 1 do
begin
if buf[i] = $FFFF then
Writeln('Глиф отсутствует')
else
Writeln('Глиф присутствует');
end;
end;
end;
procedure FilterFonts;
var
dc: HDC;
font: TFont;
languagesToCheck: array of UnicodeString;
begin
dc := GetDC(0);
SetFontLanguagePreferences(dc, TFontLanguagePreferences.Default);
languagesToCheck := ['Ф', 'Ў', 'ξ']; // Пример набора символов для проверки
for font in Screen.Fonts do // Предполагается, что Screen.Fonts доступен для перебора
begin
dc := CreateCompatibleDC(dc);
SelectFont(dc, FontNameToHandle(font.Name, FN_DEFAULT));
var isSupported := True;
for var language in languagesToCheck do
begin
isSupported := isSupported and (GetGlyphIndicesW(dc, language, Length(language), nil, 0) <> 0);
end;
if not isSupported then
Continue;
// Добавление шрифта в список поддерживающих нужные языки
end;
ReleaseDC(0, dc);
end;
Альтернативный способ
Если требуется проверить поддержку целого набора символов, можно использовать функцию EnumFontFamiliesEx. Эта функция возвращает список установленных шрифтов, поддерживающих заданный набор символов, или другие запрашиваемые характеристики.
function EnumFontCallback(lpelfe: PLogFont; lpntme: PNewTextMetricEX; FontType: DWORD; lp: LPARAM): Integer; stdcall;
begin
// Добавление имени шрифта в список поддерживающих заданный набор символов
Result := 1; // Возвращаем 1, чтобы продолжить перебор
end;
procedure FilterFontsByCharacterSet;
var
lf: TLogFont;
begin
ZeroMemory(@lf, SizeOf(TLogFont));
lf.lfCharSet := DEFAULT_CHARSET; // Задаем набор символов для проверки
EnumFontFamiliesEx(Canvas.Handle, lf, @EnumFontCallback, NativeInt(nil), 0);
end;
Заключение
В статье был рассмотрен способ проверки шрифтов на поддержку определенных языков в приложениях на Delphi и Pascal. Используя функцию GetGlyphIndices или EnumFontFamiliesEx, можно фильтровать шрифты, поддерживающие нужные языковые наборы, и использовать их в приложении.
При разработке приложений на Delphi и Pascal необходимо уметь проверять шрифты на поддержку определённых языковых наборов для корректного отображения текста.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.