В разработке графических приложений на Delphi и Pascal часто возникает задача отображения текста на канве (Canvas) с использованием различных шрифтов. В этой статье мы рассмотрим, как изменить шрифт на канве, а также как найти и использовать альтернативные шрифты, если нужный шрифт отсутствует в системе.
Проблема:
Предположим, вы разрабатываете приложение, которое загружает данные из внешнего файла, например, DXF, и отображает их на канве. Файл может содержать информацию о шрифте, который необходимо использовать для отображения текста. Однако, если указанный шрифт отсутствует в системе пользователя, текст может отображаться некорректно.
Решение:
Использование TBitmap.Canvas:
В Delphi и Pascal для рисования на канве обычно используется объект TBitmap.Canvas. Чтобы изменить шрифт, используемый для рисования текста, необходимо изменить свойства объекта TBitmap.Canvas.Font.
var img: TBitmap;
begin
img := TBitmap.Create;
img.SetSize(500, 500);
img.Canvas.Brush.Style := bsSolid;
img.Canvas.Brush.Color := clRed;
// Изменение шрифта
img.Canvas.Font.Name := 'Arial'; // Указываем имя шрифта
img.Canvas.Font.Size := 12; // Указываем размер шрифта
img.Canvas.Font.Color := clBlack; // Указываем цвет шрифта
img.Canvas.TextOut(0, 0, 'Привет, мир!');
end;
Проверка доступности шрифта:
Перед тем, как установить шрифт, рекомендуется проверить, доступен ли он в системе. Для этого можно использовать свойство Screen.Fonts, которое возвращает список установленных шрифтов.
function FontExists(const FontName: string): Boolean;
var i: Integer;
begin
Result := False;
for i := 0 to Screen.Fonts.Count - 1 do
begin
if SameText(Screen.Fonts[i], FontName) then
begin
Result := True;
Exit;
end;
end;
end;
var img: TBitmap;
begin
img := TBitmap.Create;
img.SetSize(500, 500);
img.Canvas.Brush.Style := bsSolid;
img.Canvas.Brush.Color := clRed;
if FontExists('Arial') then
begin
img.Canvas.Font.Name := 'Arial';
end else
begin
// Используем шрифт по умолчанию или альтернативный шрифт
img.Canvas.Font.Name := 'Tahoma';
end;
img.Canvas.Font.Size := 12;
img.Canvas.Font.Color := clBlack;
img.Canvas.TextOut(0, 0, 'Привет, мир!');
end;
Поиск альтернативных шрифтов:
Если нужный шрифт отсутствует, можно попытаться найти альтернативный шрифт, который наиболее похож на него. В контексте обсуждения предлагается функция FindFontOrReplacement, которая принимает список шрифтов (разделенных запятыми, точками с запятой, переводами строк или табуляциями) и возвращает первый шрифт из списка, который найден в системе.
function FindFontOrReplacement(SimilarFonts: String): String;
var
fonts: TStringArray;
i: Integer;
begin
fonts := SimilarFonts.Split([',', ';', #13, #10, #9]); // Разделители в списке шрифтов
for i := 0 to High(fonts) do
if Screen.Fonts.IndexOf(trim(fonts[i])) > 0 then
begin
Result := fonts[i];
exit;
end;
Result := ''; // Шрифт не найден
end;
var
img: TBitmap;
begin
img := TBitmap.Create;
img.SetSize(500, 500);
img.Canvas.Brush.Style := bsSolid;
img.Canvas.Brush.Color := clRed;
// Поиск альтернативного шрифта
img.Canvas.Font.Name := FindFontOrReplacement('Arial;Liberation Sans;Noto Sans');
if img.Canvas.Font.Name = '' then
begin
// Ни один из шрифтов не найден, используем шрифт по умолчанию
img.Canvas.Font.Name := 'default';
end;
img.Canvas.Font.Size := 12;
img.Canvas.Font.Color := clBlack;
img.Canvas.TextOut(0, 0, 'Привет, мир!');
end;
Использование fpTTF (для более сложных задач):
В контексте обсуждения упоминается модуль fpTTF, который предназначен для работы со шрифтами TrueType. Этот модуль может быть полезен, если требуется более тонкий контроль над отображением шрифтов, например, при работе с PDF-файлами или при необходимости использования шрифтов, которые не установлены в системе, а загружаются из файла. Однако, для простых задач, таких как изменение шрифта на канве, обычно достаточно использовать стандартные средства Delphi/Pascal. fpTTF может быть избыточным.
Альтернативное решение (использование TFontDialog):
Для интерактивного выбора шрифта пользователем можно использовать компонент TFontDialog.
uses
..., FontDialogs;
procedure TForm1.Button1Click(Sender: TObject);
begin
FontDialog1.Font := Image1.Picture.Bitmap.Canvas.Font; // Инициализируем текущим шрифтом
if FontDialog1.Execute then
begin
Image1.Picture.Bitmap.Canvas.Font := FontDialog1.Font;
Image1.Repaint; // Перерисовываем Image
end;
end;
Это позволит пользователю выбрать шрифт, размер и стиль из стандартного диалогового окна выбора шрифта.
Заключение:
Изменение шрифта на канве в Delphi и Pascal - достаточно простая задача. Однако, важно учитывать возможность отсутствия нужного шрифта в системе пользователя и предусмотреть альтернативные варианты, такие как поиск похожих шрифтов или использование шрифта по умолчанию. Функция FindFontOrReplacement и компонент TFontDialog предоставляют удобные инструменты для решения этой проблемы. Выбор конкретного метода зависит от требований вашего приложения и сложности задачи.
В статье рассматривается изменение шрифта на канве в Delphi/Pascal, включая проверку доступности шрифта, поиск альтернативных вариантов и использование компонента TFontDialog для интерактивного выбора шрифта пользователем.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.