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

Является ли шрифт шрифтом с фиксированной шириной

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

Является ли шрифт шрифтом с фиксированной шириной

Автор: Andy King

Посмотрите в библиотеке console.zip от Danny Thorpe -- он проверяет, является ли шрифт шрифтом с фиксированной шириной. Вот код, который делает это:


procedure TConsole.FontChanged(Sender: TObject);
var
  DC: HDC;
  Save: THandle;
  Metrics: TTextMetric;
  Temp: string;
begin
  if Font.Handle <> FOldFont.Handle then
  begin
    DC := GetDC(0);
    Save := SelectObject(DC, Font.Handle);
    GetTextMetrics(DC, Metrics);
    SelectObject(DC, Save);
    ReleaseDC(0, DC);
    if not (((Metrics.tmPitchAndFamily and ff_Modern) <> 0) and
      ((Metrics.tmPitchAndFamily and $01) = 0)) then
    begin
      Temp := 'TConsole: ' + Font.Name +
        ' не является шрифтом с фиксированной шириной';
      Font.Name := FOldFont.Name; { Возвращаем предыдущие атрибуты шрифта }
      raise EInvalidFont.Create(Temp);
    end;
    SetMetrics(Metrics);
  end;
  FOldFont.Assign(Font);
  if csDesigning in ComponentState then
    InternalClrScr;
end;

Программный код на Delphi, который проверяет, имеет ли текущий выбранный шрифт фиксированную ширину или нет.

Описание шагов кода:

  1. Процедура FontChanged вызывается при изменении шрифта компонента (TConsole).
  2. Получает handle устройства контекста (DC) для экрана с помощью GetDC(0).
  3. Сохраняет текущий объект handle в DC с помощью SelectObject(DC, Font.Handle) для возможности получения метрик шрифта позднее.
  4. Получает метрики шрифта с помощью GetTextMetrics(DC, Metrics) и хранит их в переменной TTextMetric под названием Metrics.
  5. Восстанавливает предыдущий объект handle в DC с помощью SelectObject(DC, Save) и освобождает DC с помощью ReleaseDC(0, DC).
  6. Если шрифт не является фиксированным (т.е. имеет pitch и семейство, которые не включают оба современных и пропорциональных характеристики), то вызывает исключение с сообщением о том, что шрифт не является фиксированным.
  7. Устанавливает метрики шрифта с помощью SetMetrics(Metrics).

Код также поддерживает предыдущее состояние шрифта (FOldFont) для обеспечения возврата любых изменений, сделанных в режиме дизайна, при активации компонента в режиме выполнения.

Логика определения фиксированного или не фиксированного шрифта основана на поле tmPitchAndFamily структуры TTextMetric, которое содержит информацию о pitch и семействе шрифта. В частности, код проверяет, имеет ли шрифт оба современные (FF_MODERN) и пропорциональные характеристики (0x01), которые типичны для фиксированных шрифтов.

Если вам интересно альтернативное решение, здесь есть упрощенная версия с использованием встроенных свойств Delphi TFont:

function IsFixedWidthFont(Font: TFont): Boolean;
begin
  Result := Font.Style = [fsFixedPitch];
end;

procedure TConsole.FontChanged(Sender: TObject);
var
  Temp: string;
begin
  if not IsFixedWidthFont(Font) then
  begin
    Temp := 'TConsole: ' + Font.Name + ' не является шрифтом с фиксированной шириной';
    Font.Name := FOldFont.Name; { Возвращаем предыдущие атрибуты шрифта }
    raise EInvalidFont.Create(Temp);
  end;
   // ...
end;

Альтернативное решение использует свойство TFont.Style для проверки, имеет ли шрифт стиль fsFixedPitch, который указывает на фиксированный шрифт. Если нет, то вызывает исключение с сообщением о том, что шрифт не является фиксированным.

Статья описывает практический пример программирования на языке Delphi, в которой проверяется, является ли выбранный шрифт шрифтом с фиксированной шириной.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 00:51:57/0.0031650066375732/0