Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Поддержка языков в системах шрифтов для приложений на Delphi и Pascal

Delphi , Графика и Игры , Шрифты

При разработке приложений на 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 18:12:46/0.0037992000579834/1