Посмотрите в библиотеке console.zip от Danny Thorpe -- он проверяет, является
ли шрифт шрифтом с фиксированной шириной. Вот код, который делает это:
procedure TConsole.FontChanged(Sender: TObject);
var
DC: HDC;
Save: THandle;
Metrics: TTextMetric;
Temp: string;
beginif Font.Handle <> FOldFont.Handle thenbegin
DC := GetDC(0);
Save := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, Save);
ReleaseDC(0, DC);
ifnot (((Metrics.tmPitchAndFamily and ff_Modern) <> 0) and
((Metrics.tmPitchAndFamily and $01) = 0)) thenbegin
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, который проверяет, имеет ли текущий выбранный шрифт фиксированную ширину или нет.
Описание шагов кода:
Процедура FontChanged вызывается при изменении шрифта компонента (TConsole).
Получает handle устройства контекста (DC) для экрана с помощью GetDC(0).
Сохраняет текущий объект handle в DC с помощью SelectObject(DC, Font.Handle) для возможности получения метрик шрифта позднее.
Получает метрики шрифта с помощью GetTextMetrics(DC, Metrics) и хранит их в переменной TTextMetric под названием Metrics.
Восстанавливает предыдущий объект handle в DC с помощью SelectObject(DC, Save) и освобождает DC с помощью ReleaseDC(0, DC).
Если шрифт не является фиксированным (т.е. имеет pitch и семейство, которые не включают оба современных и пропорциональных характеристики), то вызывает исключение с сообщением о том, что шрифт не является фиксированным.
Устанавливает метрики шрифта с помощью SetMetrics(Metrics).
Код также поддерживает предыдущее состояние шрифта (FOldFont) для обеспечения возврата любых изменений, сделанных в режиме дизайна, при активации компонента в режиме выполнения.
Логика определения фиксированного или не фиксированного шрифта основана на поле tmPitchAndFamily структуры TTextMetric, которое содержит информацию о pitch и семействе шрифта. В частности, код проверяет, имеет ли шрифт оба современные (FF_MODERN) и пропорциональные характеристики (0x01), которые типичны для фиксированных шрифтов.
Если вам интересно альтернативное решение, здесь есть упрощенная версия с использованием встроенных свойств Delphi TFont:
functionIsFixedWidthFont(Font:TFont):Boolean;beginResult:=Font.Style=[fsFixedPitch];end;procedureTConsole.FontChanged(Sender:TObject);varTemp:string;beginifnotIsFixedWidthFont(Font)thenbeginTemp:='TConsole: '+Font.Name+' не является шрифтом с фиксированной шириной';Font.Name:=FOldFont.Name;{ Возвращаем предыдущие атрибуты шрифта }raiseEInvalidFont.Create(Temp);end;// ...end;
Альтернативное решение использует свойство TFont.Style для проверки, имеет ли шрифт стиль fsFixedPitch, который указывает на фиксированный шрифт. Если нет, то вызывает исключение с сообщением о том, что шрифт не является фиксированным.
Статья описывает практический пример программирования на языке Delphi, в которой проверяется, является ли выбранный шрифт шрифтом с фиксированной шириной.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.